在C#中扩展枚举

时间:2009-10-30 02:10:00

标签: c# .net enums extension-methods

我想知道我是否可以在C#中扩展Enum类型以实现我的自定义Enum.GetValues(类型)并将其称为Enum.GetMyCustomValues(type)

我正在尝试实现这样的事情:

public static bool IsFlagSet<T>(this T value, T flag) where T : Enum
{
    return (value & flag) != (T)0;
}

但是无法做到...... 我可以做任何工作吗? 干杯

4 个答案:

答案 0 :(得分:4)

Extensions适用于实例,而不适用于创建静态方法。您可以使用public static void MyExtensions(this Enum value)扩展基本枚举。但是这仍然只会在您创建的Enum实例上创建方法。添加静态方法的唯一方法就是如果类是一个部分类,就像你在外面讨论类一样。

编辑:做你想做的事我写了以下内容

public static bool IsFlagSet<T>(this Enum value, Enum flag)
{
    if (!typeof(T).IsEnum) throw new ArgumentException();
    if (value == flag) return true;
    return ((int)Enum.Parse(typeof(T), value.ToString()) &
        (int)Enum.Parse(typeof(T), flag.ToString())) != 0;
}

*警告,这个方法在使用之前需要更多考虑,我希望有更好的方法来做到这一点。

答案 1 :(得分:2)

我认为您可能正在寻找枚举的扩展方法。 这是一个起始链接: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

答案 2 :(得分:1)

还有一个例子。

    public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible
    {
        var val = value.ToUInt32(null);
        var fl = flag.ToUInt32(null);
        return (val & fl) == fl;
    }

用法。

SomeEnum val = SomeEnum.One;
bool isOne = val.Includes(SomeEnum.One); // == true
bool isTwo = val.Includes(SomeEnum.Two); // == false

答案 3 :(得分:0)

这是我能想到的最好的测试。请记住,枚举可能基于64位整数:

 public static bool IsFlagSet(this Enum value, Enum flag)
 {
     if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value)
         throw new ArgumentException();
     return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L;
 }