有没有办法分别应用c#泛型约束而不是联合?

时间:2010-09-26 22:17:42

标签: c# generics constraints

有没有办法将几个不同的csharp泛型约束应用于测试为OR而不是AND的相同类型?

我有一个扩展方法我想应用于接口的子集,但是没有通用接口或基类只能捕获我想要定位的类。

在下面的例子中,我可以编写多个方法,每个方法都有一个约束,所有约束都调用相同的Swim方法,但我想知道是否有办法编写一个具有多个非交叉约束的方法。

例如

interface IAnimal
{
   bool IsWet { get; set; }
   bool IsDrowned { get; set; }
}

public static class SwimmingHelpers
{
    /*this is the psuedo effect of what I would like to achieve*/
   public static void Swim<T>(this T animalThatCanSwim) 
    where T: IAnimal, Human |
    where T: IAnimal, Fish |
    where T: IAnimal, Whale ....
}

仅供参考我正在使用的实际场景是HTML元素,它们都实现了IElement接口,但我想只定位HTML规范中某些行为有效的元素,而不是由它们实现更具体的通用接口,例如:元素可以有一个只读属性。

3 个答案:

答案 0 :(得分:3)

不是泛型。但是,你可以通过定义像这样的普通重载来获得你想要的东西:

public static class SwimmingHelpers {
   public static void Swim(this Human animalThatCanSwim) {
      SwimInternal(animalThatCanSwim);
   }
   public static void Swim(this Fish animalThatCanSwim) {
      SwimInternal(animalThatCanSwim);
   }
   public static void Swim(this Whale animalThatCanSwim) {
      SwimInternal(animalThatCanSwim);
   }
   private static void SwimInternal(IAnimal animalThatCanSwim) {
      // do your work here, no duplication of the code needed
   } 
}

答案 1 :(得分:1)

当你考虑到通用约束不能强制执行你对方法的预期用途时,它不能以这种方式工作的原因是有道理的。相反,它们允许您对类型参数做出某些假设。例如,通过将类型约束为IComparable,您知道即使尚未知道确切类型,也可以调用Compare方法。使用new()约束类型可确保您可以在类型上调用默认构造函数。因此,如果通用约束允许您指定一个或另一个约束,则无法进行这些假设。

答案 2 :(得分:0)

泛型中没有OR运算符。

但是你总是可以引入新的接口来捕获类的子集,即。 IReadOnly。这可以是不定义任何方法的标记接口。随着时间的推移,您实际上可能会找到这些新接口的一些用法......