2015-12-14 1 views
1

Я пытаюсь создать общий метод GET для моего веб-api с помощью RestSharp.Restsharp return IEnumerable типа T

public IEnumerable<T> GetData<T>(string url, DataFormat ReturnFormat) 
{ 
    RestRequest request = new RestRequest(url, Method.GET) { RequestFormat = ReturnFormat }; 
    return _restClient.Execute<IEnumerable<T>>(request); 
} 

Но последняя строка имеет ошибку

Ошибка 2 «System.Collections.Generic.IEnumerable» должен быть не абстрактный тип с конструктором общественного порядка в без параметров, чтобы использовать его в качестве параметра «T» в родовом типе или методе «RestSharp.RestClient.Execute (RestSharp.IRestRequest)»

Я думаю, что вопрос является возвращаемым типом IEnumerable, но подумал, что было бы, если я workd помещен каким-то ограничение по типу возврата? Если да, то ?

Ok..i просто изменил код этого

 public IEnumerable<T> GetData<T>(string url, DataFormat ReturnFormat) 
    { 
     RestRequest request = new RestRequest(url, Method.GET) { RequestFormat = ReturnFormat }; 
     var a = _restClient.Execute<List<string>>(request); 

     return (IEnumerable<T>)a.Data; 

    } 

Он компилирует. Не уверен, если это сработает ... но почему он сейчас счастлив?

+0

Как вы ожидаете, что клиент укажет общий аргумент типа? Возможно, у вас должен быть другой параметр, указывающий имя типа, и просто введите тип возвращаемого значения 'IEnumerable'. –

+0

Помог ли мой ответ? –

ответ

0

Это радует, потому что Execute<T> имеет аргумент типа аргумента new() constraint. Это просто означает, что T должен быть конкретным типом без конструктора без параметров или компилятор будет жаловаться. Предположительно, реализация Execute<T> делает что-то вроде result = new T();, а предел new() гарантирует, что тип может быть создан таким образом. Если вы просто предоставляете интерфейс для T, он не знает, как построить конкретный экземпляр. Ограничение new() предотвращает это, ловя его во время компиляции.