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]
?
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]
?
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;
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
@ Tyler Dodałem przykład pokazujący, jak możesz rzucić instancję ogólnego parametru typu na "Enum". – phoog
dzięki @phoog. nadal próbuję go rozwiązać, ale zauważyłem, że metoda hasFlag() pojawiła się w intellisense! – DevDave
W skrócie, nie można. Ograniczenia nie uwzględniają atrybutów w parametrach ogólnych. Musiałbyś to wymusić poprzez odbicie. –
Parametry typu powinny zaczynać się od 'T'; powinieneś zmienić 'GenericEnum' na' TEnum'. – SLaks
możesz podać przykład @ M.Babcock? i odpowiednio napisano, @SLaks – DevDave