La chiamata del metodo di istanza richiede comunque la boxe, quindi, poiché non è possibile limitare a Enum
, è sufficiente abbandonare i generici e utilizzare Enum
. Per esempio, invece di:
void Something(TEnum enumValue, TEnum flags)
{
if (enumValue.HasFlags(flags))
//do something ...
}
Fate questo:
void Something(Enum enumValue, Enum flags)
{
if (enumValue.HasFlags(flags))
//do something ...
}
In un metodo generico, si potrebbe raggiungere il tuo obiettivo in questo modo:
void Something(TEnum enumValue, TEnum flags)
{
Enum castValue = (Enum)(object)enumValue;
Enum castFlags = (Enum)(object)flags;
if (castValue.HasFlags(castFlags))
//do something ...
}
Questa un'eccezione in fase di esecuzione se chiami il metodo con un tipo di valore che non è un enum. Si potrebbe anche lanciare via ValueType
piuttosto che object
, dal momento che il parametro di tipo è noto per rappresentare un tipo di valore:
Enum castValue = (Enum)(ValueType)enumValue;
In breve, non si può. I vincoli non considerano gli attributi sui parametri generici. Dovresti applicarlo attraverso la riflessione. –
I parametri di tipo dovrebbero iniziare con 'T'; dovresti cambiare 'GenericEnum' in' TEnum'. – SLaks
potresti fare un esempio @ M.Babcock? e debitamente annotato, @SLaks – DevDave