2011-06-22 9 views
32

Powiel możliwe:
Enum type constraints in C#Korzystanie enum jako parametr typu rodzajowego w C#

Czy jest możliwe aby użyć enum typy jako ogólny paramter przy użyciu jego klasy otoki Enum?

mam różne teksty stałe:

enum errors1 { E1, E3, E8 }; 
enum errors2 { E0, E2, E9 }; 
enum errors3 { E7, E4, E5 }; 

z następującymi deklaracji klasy Myślałem, że mogę to osiągnąć:

public class MyErrors<T> where T : Enum 
{ 
    T enumeration; 

    public T getEnumeration() 
    { 
     return enumeration; 
    } 

    static void Main(string[] args) 
    { 

     Program<error1> p = new Program<error1>(); 
     p.getEnumeration().E1 // this call does NOT work 
    } 

Jednakże, ponieważ ogólny typ jest Enum mogę uzyskać dostęp tylko element i metody klasy Enum. Czy możliwe jest zaimplementowanie jej w taki sposób, w jaki zamierzałem, lub w jaki inny sposób powinienem użyć?

Odpowiedz

38

Nie, niestety nie jest to możliwe. Najlepsze co możesz zrobić, to użyć where T : struct, IComparable, IConvertible, IFormattable (co oczywiście nie jest takie samo). Ograniczenia interfejsu pochodzą z implementacji System.Enum.

Oprócz tego można sprawdzić, czy typeof(T).IsEnum, który może wykryć problem w czasie wykonywania i prawdopodobnie rzucić wyjątek. Ale nie ma sposobu na wymuszenie tego ograniczenia podczas kompilacji.

12

Nie jest to możliwe na poziomie języka w języku C#, ale jest obsługiwane przez podstawowy plik CLR. Możesz użyć funkcji Jona Skeeta: Unconstrained Melody, która przekształci wygenerowany plik binarny na jeden z aktualnym ograniczeniem generowanym przez enum.