2009-10-30 12 views
5

me preguntaba si puedo o no ampliar el tipo de enumeración en C# para poner en práctica mis Enum.GetValues ​​personalizados (tipo) y llamarlo como Enum.GetMyCustomValues ​​(tipo)La extensión de Enum en C#

Estoy tratando de poner en práctica algo como esto:

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

pero no se puede hacer ... cualquier arounds de trabajo que puedo hacer? Cheers

+0

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

+0

Tal vez esto? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

Respuesta

4

Las extensiones funcionan en instancias, no para crear métodos estáticos. Puede ampliar la base Enum usando public static void MyExtensions(this Enum value). Pero esto solo crearía métodos en las instancias de Enum que crees. La única forma de agregar métodos estáticos como si estuvieras hablando externamente para una clase es si la clase es una clase parcial.

Editar: para hacer algo como quieres que escribí la siguiente advertencia

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

*, este método necesita ser pensado más antes de su uso, estoy esperando que hay una mejor manera de hacerlo .

+2

No hay necesidad de la restricción genérica – shf301

2

Creo que es posible que esté buscando métodos de extensión para enums. Aquí hay un enlace de inicio: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

No es realmente lo que estoy buscando, más interesado en extender Enum.SomeMethod() en lugar de MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx, dado que el enlace no estaba disponible para mí. – dividius

0

Aquí está la mejor prueba que pude pensar. Recuerde que las enumeraciones se pueden basar en entradas 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

Y un ejemplo más.

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

Y el uso.

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