2012-03-01 12 views
6

Sto appena iniziando con Generics in C# ma ho avuto un problema all'inizio, come posso chiamare .HasFlag() su un Enum generico?HasFlag con un enum generico?

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

Come è possibile aggiungere l'attributo [Flags] ad esso?

+0

In breve, non si può. I vincoli non considerano gli attributi sui parametri generici. Dovresti applicarlo attraverso la riflessione. –

+1

I parametri di tipo dovrebbero iniziare con 'T'; dovresti cambiare 'GenericEnum' in' TEnum'. – SLaks

+0

potresti fare un esempio @ M.Babcock? e debitamente annotato, @SLaks – DevDave

risposta

6

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; 
+0

Inizialmente stavo facendo quello che stavi suggerendo, ma sto cercando di ridefinire diversi metodi che usano il tuo esempio in uno che richiede un enumerico generico e che è ancora in grado di chiamare ha flag su di esso – DevDave

+2

@Tyler Ho aggiunto un esempio che mostra come puoi cast un'istanza di un parametro di tipo generico a 'Enum'. – phoog

+0

grazie @phoog. sto ancora cercando di risolverlo ma ho notato che il metodo HasFlag() è apparso in intellisense! – DevDave

Problemi correlati