Для вызова метода экземпляра все равно потребуется бокс, поэтому, поскольку вы не можете ограничиться 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;