我刚刚从c中的Generics开始,但是很早就遇到了一个问题,我如何在泛型.HasFlag()上调用Enum

public class Example<TEnum> where TEnum : struct {
}

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

最佳答案

调用实例方法无论如何都需要装箱,因此,由于不能约束为Enum,只需放弃泛型并使用Enum。例如,代替:

void Something(TEnum enumValue, TEnum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

执行以下操作:
void Something(Enum enumValue, Enum flags)
{
    if (enumValue.HasFlags(flags))
        //do something ...
}

在一般方法中,您可以实现如下目标:
void Something(TEnum enumValue, TEnum flags)
{
    Enum castValue = (Enum)(object)enumValue;
    Enum castFlags = (Enum)(object)flags;

    if (castValue.HasFlags(castFlags))
        //do something ...
}

如果调用的方法的值类型不是枚举,则在运行时将引发异常。您也可以通过ValueType而不是object进行强制转换,因为type参数表示值类型:
Enum castValue = (Enum)(ValueType)enumValue;

关于c# - HasFlag具有通用枚举吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9519596/

10-13 06:00