繁体   English   中英

返回泛型类型的泛型方法

[英]Generic method returning generic type

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

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

由于MyClassA也可以MyClassBMyClassC我想过做这可能处理这个的通用方法。 但没有任何运气。 这是我的尝试:

公共接口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();
}

签名是:

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 但是根据定义,抽象类不能实例化,这就是你得到这个错误的原因。

这个 :

where T : new();

意味着T将在方法内部创建。 但是如何创建抽象类的实例呢? 因此出错了。

客户端对象上的Execute方法可能有一个T: [Something]约束,您的泛型方法也需要应用。 查看源代码(如果可能)或文档以查看where约束是否应用于泛型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM