泛型方法返回泛型类型
本文关键字:泛型类型 返回 泛型方法 | 更新日期: 2023-09-27 18:02:48
我正在使用一个接受类型的restclient,该类型稍后被转换为正确的IRestResponse
。
IRestResponse<MyClassA> response = client.Execute<MyClassA>();
由于MyClassA
也可以是MyClassB
或MyClassC
,我想制作一个可以处理这个问题的通用方法。然而,没有任何运气。这是我的尝试:
公共接口IRestClient{IRestResponse = PerformExecuteClient()
private RestResponse<T> PerformExecuteClient<T>() {
return client.Execute<T>();
}
编译器告诉我client.Execute<T>
不接受抽象类型。这说得通,但我不知道还能怎么做这个方法。我想要达到的目标有可能实现吗?
基于一些注释的附加信息。正如Brains main所建议的,该方法在这里不接受抽象类型。
public interface IRestClient{
IRestResponse<T> Execute<T>(IRestRequest request) where T : new();
}
签名为:
IRestResponse<T> Execute<T>(IRestRequest request) where T : new();
new
的泛型约束不允许抽象类。相反,你可以:
- 为你的类提供一个接口,并对它有一个通用的约束。
- 将
MyClassA
更改为不抽象 - 删除约束
就我个人而言-我认为是界面选项-但这是基于个人意见:)
在任何情况下,PerformExecuteClient<T>
必须至少遵循它所执行的Execute<T>
的一般约束
你试过了吗:
private RestResponse<T> PerformExecuteClient<T>() where T : new()
{
return client.Execute<T>();
}
正如这里每个人指出的那样,您必须遵循接口的泛型约束才能使此工作。如果你不这样做,你就没有通过传递一个意外的类型来尊重接口契约。
同样,where T : new()
意味着您可以像new T()
那样实例化T
。但是根据定义,抽象类不能被实例化,这就是为什么你会得到这个错误。
This:
where T : new();
表示T
将在方法内部创建。但是如何创建抽象类的实例呢?
客户端对象上的Execute方法可能有一个where T: [Something]
约束,您的泛型方法也需要应用该约束。查看源代码(如果可能的话)或文档,看看where约束是否应用于泛型。