2009-10-30 6 views
5

je me demandais si je peux étendre le type Enum en C# pour mettre en œuvre mes Enum.GetValues ​​personnalisés (type) et l'appeler comme Enum.GetMyCustomValues ​​(type)Extension Enum en C#

Je suis en train de mettre en œuvre quelque chose comme ceci:

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

mais il ne peut pas être fait ... toute arounds de travail que je peux faire? Cheers

+0

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

+0

Peut-être cela? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

Répondre

4

Les extensions fonctionnent sur des instances, pas pour créer des méthodes statiques. Vous pouvez étendre la base Enum en utilisant public static void MyExtensions(this Enum value). Mais cela créerait seulement des méthodes sur les instances Enum que vous créez. La seule façon d'ajouter des méthodes statiques comme vous parlez de manière externe pour une classe est si la classe est une classe partielle.

Edit: faire quelque chose comme vous voulez que j'ai écrit le

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

* avertissement, cette méthode doit être pensé plus avant l'utilisation, j'espère qu'il ya une meilleure façon de le faire .

+2

La contrainte générique n'est pas nécessaire – shf301

2

Je pense que vous cherchez peut-être des méthodes d'extension pour enums. Voici un lien de départ: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

Pas vraiment ce que je cherche, plus intéressé par l'extension de l'Enum.SomeMethod() au lieu de MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx, puisque le lien était en panne pour moi. – dividius

0

Voici le meilleur test auquel je puisse penser. Rappelez-vous que les enums pourraient être basés sur des bits de 64 bits:

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

Et encore un exemple.

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

Et l'utilisation.

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