2012-03-01 8 views
6

Estoy empezando con Generics en C# pero me he encontrado con un problema desde el principio, ¿cómo puedo llamar al .HasFlag() en un genérico Enum?HasFlag con una enumeración genérica?

public class Example<TEnum> where TEnum : struct { 
} 

¿Cómo puedo añadir el atributo [Flags]?

+0

En resumen, no se puede. Las restricciones no consideran atributos en los parámetros genéricos. Tendría que aplicarlo a través de la reflexión. –

+1

Los parámetros de tipo se supone que comienzan con 'T'; deberías cambiar 'GenericEnum' por' TEnum'. – SLaks

+0

¿podría dar un ejemplo @ M.Babcock? y debidamente anotado, @SLaks – DevDave

Respuesta

6

Llamar al método de instancia requerirá boxeo de todos modos, por lo que, como no puede restringir a Enum, simplemente abandone los genéricos y use Enum. Por ejemplo, en lugar de:

void Something(TEnum enumValue, TEnum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

Haga lo siguiente:

void Something(Enum enumValue, Enum flags) 
{ 
    if (enumValue.HasFlags(flags)) 
     //do something ... 
} 

En un método genérico, que podría lograr su objetivo como esto:

void Something(TEnum enumValue, TEnum flags) 
{ 
    Enum castValue = (Enum)(object)enumValue; 
    Enum castFlags = (Enum)(object)flags; 

    if (castValue.HasFlags(castFlags)) 
     //do something ... 
} 

Esto va a lanzar una excepción en tiempo de ejecución si llama al método con un tipo de valor que no es una enumeración. También podría emitir a través de ValueType en lugar de object, ya que el parámetro tipo es conocido para representar un tipo de valor:

Enum castValue = (Enum)(ValueType)enumValue; 
+0

Estaba haciendo lo que sugirió inicialmente, pero estoy tratando de refactorizar varios métodos que usan su ejemplo en uno que tomará una enumeración genérica y aún así podrá llamar tiene indicadores en él – DevDave

+2

@Tyler Agregué un ejemplo que muestra cómo puede lanzar una instancia de un parámetro de tipo genérico a 'Enum'. – phoog

+0

gracias @phoog. Todavía estoy tratando de resolverlo, pero he notado que el método HasFlag() ha aparecido en intellisense. – DevDave

Cuestiones relacionadas