c# - 如何对通用约束进行分组?

标签 c# generics

我正在尝试为泛型方法指定约束 groups,但我不确定这在 C# 中是否可行。如果是,我在弄清楚语法时遇到了麻烦。目前我有以下内容:

public TOut GetResponse<TOut, TIn>(TIn message)
    where TOut : BaseMessageResponse
    where TIn  : BaseMessageRequest

哪个功能非常好。但是我实际上并不发送或接收基类消息,而是派生类。我真正想要的是能够声明组,这样我就可以在编译时判断我是否有不匹配的请求和响应类型。所以我想要的是这样的:

public TOut GetResponse<TOut, TIn>(TIn message)
    (where TOut : Derived1Response
    where TIn : Derived1Request)
    (where TOut : Derived2Response
    where TIn : Derived2Request)

这是可以在单个方法定义中完成的事情吗?

还有另一种解决方案,即为每对请求/响应对象定义一个方法,并让每个对象调用我现在拥有的通用泛型方法,如下所示:

public Derived1Response GetResponse(Derived1Request request)
{
    return GetResponse<Derived1Response, Derived1Request>(request);
}

public Derived2Response GetResponse(Derived2Request request)
{
    return GetResponse<Derived2Response, Derived2Request>(request);
}

然而,这会使代码膨胀,从而违背了使用泛型的初衷。

最佳答案

如果是我,我会将通用定义移到类级别,并为不同的请求/响应类型使用单独的实例。

例如

public myClass<TOut, TIn>
    where TOut : BaseMessageResponse
    where TIn  : BaseMessageRequest
{
    public TOut GetResponse(TIn)
    {
        ...
    }
}

然后使用:

var derived1Processing = new myClass<Derived1Response, Derived1Request>();
var derived2Processing = new myClass<Derived2Response, Derived2Request>();

关于c# - 如何对通用约束进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34517340/

相关文章:

c# - 尽管有 info.plist 属性,Xamarin IOS 项目仍允许旋转

java - 将 ArrayList<String> 转换为 ArrayList<Object>

swift - Swift 3 中泛型的泛型

c# - Serilog logger wrapper 的实现和使用

c# - 字符串清理和格式化

c# - 通过加载 MVC 复选框,选中以禁用文本框

java - 如何在 Java 的泛型(Erasure)中检索类型信息?

c# - 发送参数后异步等待事件

java - 桥接方法创建

c# - 通过编写通用递归函数合并 C# .net 中的复杂字典