2009-10-30 16 views
5

Zastanawiałem się, czy mogę przedłużyć typu Enum w C#, aby realizować swoje własne Enum.GetValues ​​(typ) i nazwać jak Enum.GetMyCustomValues ​​(typ)Rozszerzanie Enum w C#

próbuję wdrożyć coś takiego:

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

ale nie można zrobić ... żadnych arounds pracy mogę zrobić? Pozdrowienia

+0

http://stackoverflow.com/questions/1415140/c-enums-can-my-enums-have-friendly-names –

+0

Może to? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

Odpowiedz

4

Rozszerzenia działają na instancjach, a nie na tworzenie metod statycznych. Możesz rozszerzyć bazę Enum przy pomocy public static void MyExtensions(this Enum value). Ale to nadal tworzyłoby tylko metody na instancje Enum, które tworzysz. Jedynym sposobem dodania statycznych metod, takich jak na przykład zewnętrzne, jest klasa, która jest klasą częściową.

Edit: coś zrobić jak chcesz napisałem następujący

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

* ostrzeżenie, metoda ta musi być przemyślane bardziej przed użyciem, Mam nadzieję, że istnieje lepszy sposób to zrobić .

+2

Nie ma potrzeby stosowania ogólnego ograniczenia – shf301

2

Myślę, że być może szukasz metod rozszerzania dla wyliczeń. Oto link wyjściowy: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

Niezupełnie tego, czego szukam, bardziej zainteresowany rozszerzeniem metody Enum.SomeMethod() zamiast MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx, ponieważ link był dla mnie niedostępny. – dividius

0

Oto najlepszy test, jaki mogłem wymyślić. Pamiętaj, że wyliczenia mogą być oparte na 64-bitowych wzorcach:

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

I jeszcze jeden przykład.

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

I użycie.

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