泛型方法返回泛型类型

本文关键字:泛型类型 返回 泛型方法 | 更新日期: 2023-09-27 18:02:48

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

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

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

公共接口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的泛型约束不允许抽象类。相反,你可以:

  1. 为你的类提供一个接口,并对它有一个通用的约束。
  2. MyClassA更改为不抽象
  3. 删除约束

就我个人而言-我认为是界面选项-但这是基于个人意见:)

在任何情况下,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约束是否应用于泛型。