Extending Enum in C#

橙三吉。 提交于 2019-12-12 11:17:12

问题


I was wondering whether or not I can extend the Enum type in C# to implement my custom Enum.GetValues(type) and call it like Enum.GetMyCustomValues(type)

I am trying to implement something like this:

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

but it cannot be done... any work arounds I can do? Cheers


回答1:


Extensions work on instances, not for creating static methods. You can extend the base Enum using public static void MyExtensions(this Enum value). But this would still only create methods on Enum instances you create. The only way to add static methods like you're talking about externally for a class is if the class is a partial class.

Edit: to do something like you want I wrote the following

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;
}

*warning, this method needs to be thought out more prior to use, I'm hoping there is a better way to do it.




回答2:


I think you may be looking for extension methods for enums. Here's a starting link: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx




回答3:


And one more example.

    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;
    }

And the usage.

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



回答4:


Here's test best I could think of. Remember that enums could be based on 64 bit ints:

 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;
 }


来源:https://stackoverflow.com/questions/1647634/extending-enum-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!