我怀疑答案是否定的,但我想知道是否可以这样做:
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>()
// This doesn't compile.
where TSomeClass : TSomeInterface
{
//...
}
}
在上面的(非工作)示例中,我的意思是限制TSomeInterface
它可以是任何基类、实现的接口,或者(如果你真的想花哨的话)隐式转换MyGenericClass
.
注意:
我怀疑这从未在 C# 中实现的原因是通用约束并不是真正的代码契约,这就是我在这里尝试使用它们的方式。我真的不在乎是什么类型TSomeInterface
,只要它是由TSomeClass
.
到目前为止,我已经一起破解了这个:
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TIntermediateType, TSomeInterface>()
where TIntermediateType : TSomeClass, TSomeInterface
{
//...
}
}
这或多或少强制了我想要的约束(TSomeClass
必须继承自,或者在接口的情况下,实现,TSomeInterface
),但是调用它非常笨拙,因为我必须指定TIntermediateType
(即使我真的希望它评估TSomeClass
):
var myGenericInstance = new MyGenericClass<TSomeClass>();
myGenericInstance.MyGenericMethod(TSomeClass, TSomeInterface);
此外,上述技巧被破坏了,因为调用者理论上可以将 的子类指定TSomeClass
为第一个类型参数,其中只有子类实现TSomeInterface
.
我想这样做的原因是我正在为 WCF 服务编写流利的工厂模式,并且我想防止调用者(在编译时)尝试使用服务类没有的合同创建端点' t 实施。我显然可以在运行时检查这个(WCF 实际上是为我做的),但我是编译时检查的忠实粉丝。
有没有更好/更优雅的方式来实现我在这里追求的目标?