2009-10-30 23 views
5

mi chiedevo se o non posso estendere il tipo Enum in C# per implementare i miei Enum.GetValues ​​personalizzati (tipo) e chiamarlo come Enum.GetMyCustomValues ​​(tipo)Estendere Enum in C#

Sto cercando di implementare qualcosa di simile:

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

, ma non si può fare ... eventuali arounds di lavoro che posso fare? Cheers

+0

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

+0

Forse questo? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

risposta

4

Le estensioni funzionano su istanze, non per la creazione di metodi statici. È possibile estendere la base Enum utilizzando public static void MyExtensions(this Enum value). Ma questo creerebbe solo metodi su istanze di Enum che creerai. L'unico modo per aggiungere metodi statici come si sta parlando esternamente per una classe è se la classe è una classe parziale.

Edit: per fare qualcosa di simile che vuoi ho scritto il seguente avviso

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

*, questo metodo deve essere pensato di più prima dell'uso, spero ci sia un modo migliore per farlo .

+2

Non è necessario il vincolo generico – shf301

2

Penso che potresti cercare metodi di estensione per enumerazioni. Ecco un link di partenza: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

Non proprio quello che sto cercando, più interessato ad estendere l'Enum.SomeMethod() invece di MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx, dal momento che il collegamento non era disponibile. – dividius

0

Ecco il test migliore che potessi pensare. Ricorda che le enumerazioni potrebbero essere basate su 64 bit:

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

E un altro esempio.

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

E l'utilizzo.

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