2010-10-13 6 views
5

Quiero hacer un método de extensión para verificar si una enumeración tiene un indicador.Método de extensión C# para verificar si una enumeración tiene un indicador establecido

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday; 
// instead of this: 
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday) 
    ... 

// I want this: 
if (workDays.ContainsFlag(DaysOfWeek.Monday)) 
    ... 

¿Cómo puedo lograr esto? (Si hay una clase que ya hace esto, entonces le agradecería una explicación de cómo esto puede ser codificada;! He estado jugando con este método demasiado tiempo)

gracias de antemano

+0

posible duplicado de [Extendiendo Enum in C#] (http://stackoverflow.com/questions/1647634/extending-enum-in-c) –

+0

Eso realmente ayudó, gracias por el hallazgo. – Marlon

Respuesta

10

.NET 4 ya incluye esta funcionalidad, así que, si es posible, actualízala.

days.HasFlag(DaysOfWeek.Monday); 

Si no es posible actualizar, aquí es la aplicación de dicho método:

public bool HasFlag(Enum flag) 
{ 
    if (!this.GetType().IsEquivalentTo(flag.GetType())) { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    } 

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue()); 
    return ((uThis & uFlag) == uFlag); 
} 

Desde aquí se puede construir el método de extensión equivalente:

public static bool HasFlag(this Enum @this, Enum flag) 
{ 
    // as above, but with '@this' substituted for 'this' 
} 
+0

Desafortunadamente, no he podido actualizar. Gracias por la rápida respuesta – Marlon

0

poco me encontré con este problema.

Si no sabe cuál es el tipo de Enum, puede convertir Enum en un int y utilizar los métodos estáticos de Enum para analizar un nombre de campo Enum en un valor y usar op_BitwiseAnd para comparar los valores.

Voy a actualizar esto más adelante con el código si está interesado, pero estoy saliendo por la puerta ahora.

Cuestiones relacionadas