我正在使用一个接受类型的restclient,后来转换为正确的IRestResponse
。
IRestResponse<MyClassA> response = client.Execute<MyClassA>();
由于MyClassA
也可以是MyClassB
或MyClassC
,因此我考虑制作一个可以处理此问题的通用方法。但没有任何运气。这是我的尝试:
public interface IRestClient { IRestResponse response = PerformExecuteClient()
private RestResponse<T> PerformExecuteClient<T>() {
return client.Execute<T>();
}
编译器告诉我client.Execute<T>
不接受抽象类型。这是有道理的,但我不知道如何制作这种方法。我想在这里实现的目标是否可能?
基于一些评论的其他信息。正如Brains Mains所说,这种方法不接受这里的抽象类型。
public interface IRestClient{
IRestResponse<T> Execute<T>(IRestRequest request) where T : new();
}
答案 0 :(得分:3)
签名是:
IRestResponse<T> Execute<T>(IRestRequest request) where T : new();
generic constraint的new
不允许抽象类。
相反,你可以:
MyClassA
更改为不抽象我个人 - 我说的是界面选项 - 但这是基于意见的:)
在PerformExecuteClient<T>
的任何情况下,它必须至少遵循它执行的Execute<T>
的通用约束。
答案 1 :(得分:2)
你试过这个:
private RestResponse<T> PerformExecuteClient<T>() where T : new()
{
return client.Execute<T>();
}
正如大家在这里指出的那样,你必须遵循界面的通用约束才能使其发挥作用。如果不这样做,则不会通过传递意外类型来尊重接口合同。
同样where T : new()
表示您可以像T
一样实例化new T()
。但是根据定义,抽象类不能实例化,这就是你得到这个错误的原因。
答案 2 :(得分:1)
这:
where T : new();
表示将在方法内创建T
。但是如何创建抽象类的实例呢?因此出错了。
答案 3 :(得分:0)
客户端对象上的Execute方法可能具有where T: [Something]
约束,您的泛型方法也需要应用该约束。查看源代码(如果可能)或文档,以查看where约束是否应用于泛型。