2011-12-31 12 views
7

Considere el siguiente código:Cómo restringir un genérico para que sea de tipo enumeración?

class Base<T> 
{ 
//Base members 
} 

Quiero que el genérico T sea una enumeración (mediante restricciones si es posible). ¿Cómo puedo hacer esto en C#?

EDIT:
Uso de contratos de código -introduced por Akash Kava- también parece ser una manera agradable. Logré que produjera un error de tiempo de ejecución que es inútil. Here es el código que probé. Debería ser posible generar una advertencia de tiempo de compilación pero no puedo hacer que funcione.

+1

Esto es un duplicado, ¿verdad? – BoltClock

+3

Enlace para duplicar, por favor? – atoMerz

+0

Muchos de ellos, pero uno de los canónicos que puedo encontrar es http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum, que aunque se trata de un método genérico , no es una clase genérica, las restricciones de tipo funcionan exactamente de la misma manera de todos modos. – BoltClock

Respuesta

12

Esto se admite en el nivel IL, pero no en C#. Puede echar un vistazo al unconstrained melody escrito por Jon Skeet que le permite lograr eso. Y aquí está el correspondiente blog post donde explica en detalle.

+1

Sorprendido de que no hay forma en C#. :( – atoMerz

+0

Por curiosidad, ¿el IL permite que un genérico constreñido enum haga cualquier cosa que un genérico sin restricciones pueda hacer aparte de invocar al lento 'Enum.HasFlag'? Mi conjetura sería que el equipo de C# juzgó el nivel de soporte de IL para ser insuficiente para lo que la gente querría hacer con genéricos restringidos enum, y pensé (erróneamente en mi humilde opinión) que sería mejor no permitirlos que permitirlos, pero no permitirles hacer mucho. – supercat

+0

There's [ExtraConstraints.Fody] (https://github.com/Fody/ExtraConstraints) para lograr todo el tejido IL de una manera muy simple. Simplemente instale los paquetes nuget 'Fody' y' ExtraConstraints.Fody' y agregue las restricciones al código como se muestra en el informe. ¿Tal vez le gustaría agregar esto a la respuesta? – BatteryBackupUnit

Cuestiones relacionadas