HasFlag с общим перечислением? - PullRequest
7 голосов
/ 01 марта 2012

Я только начинаю с Generics в C #, но рано столкнулся с проблемой, как я могу вызвать .HasFlag() для общего Enum?

public class Example<TEnum> where TEnum : struct {
}

Как мне добавить к нему атрибут [Flags]?

1 Ответ

8 голосов
/ 01 марта 2012

Для вызова метода экземпляра все равно потребуется бокс, поэтому, поскольку вы не можете ограничиться Enum, просто откажитесь от обобщений и используйте Enum.Например, вместо:

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

Сделайте это:

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

В общем методе вы можете достичь своей цели следующим образом:

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

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

Thisвыдаст исключение во время выполнения, если вы вызовете метод со значением типа, который не является enum.Вы также можете приводить с помощью ValueType вместо object, поскольку известно, что параметр типа представляет тип значения:

Enum castValue = (Enum)(ValueType)enumValue;
...