有没有办法将几个不同的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规范中某些行为有效的元素,而不是由它们实现更具体的通用接口,例如:元素可以有一个只读属性。
答案 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。这可以是不定义任何方法的标记接口。随着时间的推移,您实际上可能会找到这些新接口的一些用法......