¿Existe una solución alternativa para la restricción de tipo genérico de la clase especial Enum en C # 3.0? [duplicar]

Esta pregunta ya tiene una respuesta aquí:

¿Alguien sabe una buena solución para la falta de una restricción de enumeración genérica? 12 respuestas

Actualizar: Vea la parte inferior de esta pregunta para una solución de C #.

Hola,

Considere el siguiente método de extensión:

public static bool HasFlags<T>(this T value, T flags)
    where T : System.Enum
{
    // ...
}

Como sabrás, esto generará un error en tiempo de compilación, ya que normalmente no se permite que una clase herede deSystem.Enum. El problema es que cualquier enumeración especificada usando elenum palabra clave, de hecho, heredar deSystem.Enum, por lo que el código anterior sería la forma ideal de limitar un método de extensión a las enumeraciones solamente.

Ahora la solución obvia aquí es utilizarEnum en lugar deT, pero luego pierdes los beneficios de los tipos genéricos:

MyEnum e;
e.HasFlags(MyOtherEnum.DoFunkyStuff);

El código anterior generaría un error de tiempo de compilación utilizando tipos genéricos, mientras que solo puede generar un error de tiempo de ejecución utilizando elEnum Tipo (si lo implemento para hacerlo).

¿Hay alguna opción de compilador que pueda usarse para desactivar la verificación de restricciones, o hay alguna otra forma ingeniosa de hacer esto?

Antes de que se sugiera, me gustaría decir que no usaréwhere T : struct o algo así, desde entonces serías capaz de hacer cosas raras como123.HasFlags(456).

Estoy sorprendido de por qué existe este error ... Es el mismo problema que obtendría usandowhere T : System.Object, pero para eso tieneswhere T : class... porque no haywhere T : enum?

Solución de C #

Jon Skeet ha comenzado a trabajar en una biblioteca que compila clases con una restricción a unIEnumConstraint, que luego se reemplaza conSystem.Enum post-construcción. Creo que esto es lo más cercano a solucionar este problema en este momento.

Ver:

Proyecto de código:http://code.google.com/p/unconstrained-melody/Entrada de blog:http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx

Si esta solución no es factible, tendrá que escribir su biblioteca como código C ++ / CLI, que no limita lo que se puede usar para restricciones de tipo genérico (consulte el código en mi respuesta a continuación).

Respuestas a la pregunta(4)

Su respuesta a la pregunta