我正在尝试使用RestSharp为我的web api创建一个通用的GET方法。
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'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法'RestSharp.RestClient.Execute(RestSharp)中将其用作参数'T' .IRestRequest)'
我认为问题是IEnumerable的返回类型但是想知道如果我对返回类型设置了某种限制,它是否会起作用?如果是这样的话?
Ok ..我刚刚将代码更改为此
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 :(得分:0)
很高兴,因为Execute<T>
在类型参数上有new()
constraint。这只是意味着T
必须是具有无参数构造函数的具体类型,否则编译器会抱怨。据推测,Execute<T>
的实现与result = new T();
类似,new()
约束确保可以以这种方式实例化类型。如果您只为T
提供接口,则无法知道如何构造具体实例。 new()
约束通过在编译时捕获它来阻止它。