我怀疑答案是否定的,但我想知道是否可以做这样的事情:
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>()
// This doesn't compile.
where TSomeClass : TSomeInterface
{
//...
}
}
我的意思是在上面(非工作)示例中指出的是约束TSomeInterface
这样它可以是任何基类,实现的接口,或者(如果你真的想要花哨的话)隐式转换MyGenericClass
.
NOTE:我怀疑这从未在 C# 中实现的原因是通用约束没有really意味着代码合约,这就是我在这里尝试使用它们的方式。我真的不在乎什么类型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);
此外,上面的 hack 被破坏了,因为理论上调用者可以指定一个子类TSomeClass
作为第一个类型参数,其中只有子类实现TSomeInterface
.
我想这样做的原因是我正在为 WCF 服务编写一个流畅的工厂模式,我会like防止调用者(在编译时)尝试使用服务类未实现的约定创建端点。显然,我可以在运行时检查这一点(事实上,WCF 为我做到了这一点),但我非常喜欢编译时检查。
有没有更好/更优雅的方式来实现我在这里追求的目标?