2012-03-01 7 views
6

Po prostu zaczynam od Generics w języku C#, ale wcześnie napotkano problem, jak mogę zadzwonić pod numer .HasFlag() na ogólne Enum?HasFlag z ogólnym wyliczeniem?

Jak mogę dodać atrybut [Flags]?

+0

W skrócie, nie można. Ograniczenia nie uwzględniają atrybutów w parametrach ogólnych. Musiałbyś to wymusić poprzez odbicie. –

+1

Parametry typu powinny zaczynać się od 'T'; powinieneś zmienić 'GenericEnum' na' TEnum'. – SLaks

+0

możesz podać przykład @ M.Babcock? i odpowiednio napisano, @SLaks – DevDave

Odpowiedz

6

Wywołanie metody instancji będzie wymagało boksowania, tak więc, ponieważ nie można ograniczyć się do Enum, po prostu porzuć generyczne i użyj Enum. Na przykład, zamiast:

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

Wykonaj:

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

W sposobie rodzajowego, można osiągnąć swój cel tak:

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

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

Będzie to wyjątek w czasie wykonywania jeśli wywołasz metodę z typem wartości, który nie jest wyliczeniem. Można też rzucić poprzez ValueType zamiast object, ponieważ parametr typ jest znany do reprezentowania Typ wartości:

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

Zrobiłem to, co sugerowałeś na początku, ale próbuję zmienić kilka metod, które wykorzystują Twój przykład w taki, który zajmie ogólne wyliczenie i nadal będzie mógł wywoływać, ma na sobie flagi – DevDave

+2

@ Tyler Dodałem przykład pokazujący, jak możesz rzucić instancję ogólnego parametru typu na "Enum". – phoog

+0

dzięki @phoog. nadal próbuję go rozwiązać, ale zauważyłem, że metoda hasFlag() pojawiła się w intellisense! – DevDave