Jon*_*ood 9 c# generics generic-method
我的应用程序定义了几个enum包含该[Flags]属性的s .
我想写一个小的实用程序方法来检查是否为这些中enum的任何一个设置了标志,我想出了以下内容.
protected static bool IsFlagSet<T>(ref T value, ref T flags)
{
return ((value & flags) == flags);
}
Run Code Online (Sandbox Code Playgroud)
但这给了我错误"运算符'&'不能应用于'T'和'T'类型的操作数".
这可以使用吗?
Hen*_*man 15
Enum类已经具有实用程序功能:Enum.HasFlag(Flag f),请参阅MSDN上的示例
if (petsInFamily.HasFlag(Pet.Dog))
familiesWithDog++;
Run Code Online (Sandbox Code Playgroud)
注意:这是在C#4中引入的.虽然它非常易读,但它可能存在一些性能问题.
我知道我的回答为时已晚,但我发现了这个问题的真正惊人的解决方案。从 .Net 4 开始,我们可以dynamic在 C# 中使用类型。您的方法可以重写:
protected static bool IsFlagSet<T>(T value, T flags)
{
dynamic a = value;
dynamic b = flags;
return ((a & b) == flags);
}
Run Code Online (Sandbox Code Playgroud)
dynamic如果类型支持方法/运算符,其背后的想法允许您推迟到运行时T。因此,如果&定义了T运行时,则成功。
& 是类类型的运算符。这意味着类 T 必须有一个重载运算符 & 的方法。
.Net 不能指望每个类都会有它。所以它失败了。
您可以做的是创建一个基类,将运算符重载声明为方法。
然后使用Constraints声明 T 使用该基类:
protected static bool IsFlagSet<T> where T: BaseclassWithAnd (ref T value, ref T flags)
{
return ((value & flags) == flags);
}
Run Code Online (Sandbox Code Playgroud)