限制在泛型中使用任何一种类型

sam*_*mar 6 c#

在泛型中,我们可以使用" where "子句来给出约束

public void MyGeneric <T>() where T : MyClass1 {...}

现在如果我想要类型T是MyClass1类型说一个接口IMyInterface 然后我需要做类似的事情

public void MyGeneric <T>() where T : MyClass1, IMyInterface  {...}

但我不知道(或者可能不可能)我们是否可以创建一个通用方法,可以采用从2种类型中的任何一种继承的类型.即如果我的任何其他类继承自MyClass1 实现IMyInterface 但我的类都没有,那么我的泛型方法应该适用于这些类.

我希望我已经清楚了.

Jon*_*nna 7

你不能,而且有充分的理由.假设MyClass1和IMyInterface都有一个CoolThing()方法(可能这样的通用性正是你想要首先做这种事情的原因).你想要的代码如下:

public void MyGeneric<T>(T item) where T : MyClass1 or T : IMyInterface
{
  item.CoolThing();
}
Run Code Online (Sandbox Code Playgroud)

这个问题是因为MyClass1.CoolThing()的定义与IMyInterface.CoolThing()完全不同.您可能知道它们基本上是相同的,但它们可能确实非常不同(Employee.Fire()可能与Gun.Fire()等非常不同).

你有两个我可以看到的选择.一种是定义两种不同的方法.重载将减少调用它们的麻烦,并且它们可以在不依赖于MyClass1和IMyInterface签名的相关特征的私有方法中共享它们的一些实现.

另一种方法是使用反射来获取有关对象上名为"CoolThing"的方法的MethodInfo,然后调用它.后者显然会破坏您的编译时类型安全性.


Łuk*_*.pl 6

正如之前任何人所说的那样,您不能使用或约束,但是有一种清晰而简单的方法可以绕过这个问题。

在您希望成为泛型参数的有效类型的所有类和接口上放置一些额外的接口。这就是让您可以在通用方法中全部使用它们而不允许使用任何其他方法的解决方案。

例如:

class MyClass1 : IAllowInMyGeneric { ... }
interface IMyInterface : IAllowInMyGeneric { ... }

public void MyGeneric <T>() where T : IAllowInMyGeneric {...}
Run Code Online (Sandbox Code Playgroud)