返回泛型类型的泛型方法

时间:2016-08-17 11:40:39

标签: c# generics return

我正在使用一个接受类型的restclient,后来转换为正确的IRestResponse

IRestResponse<MyClassA> response = client.Execute<MyClassA>();

由于MyClassA也可以是MyClassBMyClassC,因此我考虑制作一个可以处理此问题的通用方法。但没有任何运气。这是我的尝试:

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();
}

4 个答案:

答案 0 :(得分:3)

签名是:

IRestResponse<T> Execute<T>(IRestRequest request) where T : new();

generic constraintnew不允许抽象类。 相反,你可以:

  1. 为您的类创建一个接口,并对其有一个通用约束。
  2. 将您的MyClassA更改为不抽象
  3. 删除约束
  4. 我个人 - 我说的是界面选项 - 但这是基于意见的:)

    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约束是否应用于泛型。