HasFlag有一个通用的枚举?

Dev*_*ave 7 c# generics enums enum-flags

我刚刚开始使用GenericsC#但很早就遇到了问题,我怎样才能调用.HasFlag()泛型Enum呢?

public class Example<TEnum> where TEnum : struct {
}
Run Code Online (Sandbox Code Playgroud)

如何向其添加[Flags]属性?

pho*_*oog 8

调用实例方法无论如何都需要装箱,所以,因为你不能限制Enum,只需放弃泛型并使用Enum.例如,而不是:

void Something(TEnum enumValue, TEnum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}
Run Code Online (Sandbox Code Playgroud)

做这个:

void Something(Enum enumValue, Enum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}
Run Code Online (Sandbox Code Playgroud)

在通用方法中,您可以实现以下目标:

void Something(TEnum enumValue, TEnum flags)
{
    Enum castValue = (Enum)(object)enumValue;
    Enum castFlags = (Enum)(object)flags;

    if (castValue.HasFlags(castFlags))
        //do something ...
}
Run Code Online (Sandbox Code Playgroud)

如果使用不是枚举的值类型调用方法,则会在运行时抛出异常.您也可以转换via ValueType而不是object,因为已知type参数表示值类型:

Enum castValue = (Enum)(ValueType)enumValue;
Run Code Online (Sandbox Code Playgroud)

  • @Tyler我添加了一个示例,展示了如何将泛型类型参数的实例转换为"Enum". (2认同)