Extending Enum in C#

18,477

Solution 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.

Solution 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

Solution 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
Share:
18,477
Joshscorp
Author by

Joshscorp

I am a Senior .Net/Silverlight/XAML/MVC developer.

Updated on June 24, 2022

Comments

  • Joshscorp
    Joshscorp almost 2 years

    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

  • Joshscorp
    Joshscorp over 14 years
    Not really what I am looking for, more interested in extending the Enum.SomeMethod() instead of MyCustomEnum.SomeMethod()
  • shf301
    shf301 over 14 years
    There is not need for the generic constraint
  • dividius
    dividius about 12 years