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;
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. –
Los parámetros de tipo se supone que comienzan con 'T'; deberías cambiar 'GenericEnum' por' TEnum'. – SLaks
¿podría dar un ejemplo @ M.Babcock? y debidamente anotado, @SLaks – DevDave