在泛型中,我们可以使用“where”子句来给出约束,例如

公共(public)无效MyGeneric ()其中T:MyClass1 {...}

现在,如果我希望类型T的类型为MyClass1并说一个接口(interface)IMyInterface,那么我需要做一些类似的事情

公共(public)无效的MyGeneric ()其中T:MyClass1,IMyInterface {...}

但是我不知道(或者也许是不可能的)我们是否可以创建一个通用方法来接受从这两种类型中的任何一种继承的类型。也就是说,如果我的任何其他类都继承自MyClass1或实现IMyInterface,但我的任何一个类都没有,则我的通用方法应适用于这些类。

我希望我已经清楚了。

最佳答案

您不能这样做,并且有充分的理由。假设MyClass1和IMyInterface都具有CoolThing()方法(大概这样的通用性正是您首先要进行此类操作的原因)。您有点想要的代码,例如:

public void MyGeneric<T>(T item) where T : MyClass1 or T : IMyInterface
{
  item.CoolThing();
}

问题在于,由于MyClass1.CoolThing()的定义与IMyInterface.CoolThing()完全不同。您可能知道它们本质上是相同的,但是它们的确可能有很大不同(Employee.Fire()与Gun.Fire()可能有很大不同,依此类推)。

我有两个选择。一种是定义两种不同的方法。重载将减轻调用它们的麻烦,并且它们可以在不依赖于MyClass1和IMyInterface签名的相关功能的私有(private)方法中共享其实现的某些部分。

另一种方法是使用反射在所讨论的对象上获取名为“CoolThing”的方法的MethodInfo,然后对其进行调用。后者显然会破坏您的编译时类型的安全性。

关于c# - 在泛型中采用两种类型的约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3458812/

10-10 22:19