У меня есть класс для использования моего REST сервиса.

Метод для этого будет выглядеть так:

public async Task<object> Get(string controller)
    {
        object data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<object>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }

В этом случае object может быть похож на мой собственный класс (Project, User и т. д.) со свойствами.

У меня вопрос, как сделать Task<object> методы универсальными, которые будут брать объекты, которые я хочу (и возвращать)?

< Сильный > ИЗМЕНИТЬ

Когда я делаю что-то вроде:

public async Task<TObject> Get<TObject>(string controller)
    {
        TObject data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<object>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }

Я получаю сообщение об ошибке await repsonse.Contet...:

Невозможно неявно преобразовать object в TObject ...

0
michasaucer 2 Май 2019 в 11:05

3 ответа

Лучший ответ

Вы можете использовать универсальные типы:

public async Task<TObject> Get<TObject>(string controller)
    {
        TObject data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<TObject>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }

Посмотрите здесь и здесь для получения дополнительной информации;)

2
Romain 2 Май 2019 в 08:15

Следующий код будет работать:

public async Task<TObject> Get<TObject>(string controller)
{
    HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

    if (response.IsSuccessStatusCode)
    {
        return await response.Content.ReadAsAsync<TObject>();
    }
    else
    {
        throw new Exception(); //todo
    }
}
1
JelleKerkstra 2 Май 2019 в 08:16

Вместо «объекта» используйте заполнитель типа «Т».

Попробуй это:

  public async Task<T> Get (string controller)
  {
     T data;
     HttpResponseMessage response = await this.HttpClient.GetAsync (UrlService.BuildEndpoint (controller));

     if (response.IsSuccessStatusCode)
     {
        data = await response.Content.ReadAsAsync<T> ();
        return data;
     }
     else
     {
        throw new Exception (); //todo
     }
  }
-1
Dmitri Caragheaur 2 Май 2019 в 08:14