2012-08-29 12 views
6

Voglio solo non utilizzare "Gestori" per ogni attributo e utilizzare un certo enume per quello.Usa il nome dell'enumerazione come un parametro di attributo

Ma sembra impossibile o mi sbaglio?

così cerco di sostituire

[RequiresRole("Managers")] 

con

[RequiresRole(HardCodedRoles.Managers.ToString())] 

... 

public enum HardCodedRoles 
{ 
      Administrators, 
      Managers 
} 
+1

Potrebbe aggiungere ulteriori dettagli in modo che sappiamo che cosa si sta cercando di realizzare? – Maciej

+0

Semplicemente non voglio usare la stringa "AnyRoleName" e voglio mettere qualche elemento da enum al posto di esso. Ma VS dà un errore Un argomento di attributo deve essere un'espressione costante, typeof espressione o espressione di creazione dell'array di un parametro di attributo type –

+1

se HardcodedRoles.Managers è una stringa const, funzionerebbe. D'altra parte, se HardcodedRoles è un'enumerazione, sarà necessario creare una sottoclasse di AuthorizeAttribute e implementare la propria, passando HardcodedRoles e/o HardcodedRoles [] al costruttore. – Maciej

risposta

11

Che ne dite di una classe, invece di un enum , rendendo la classe statica per evitare qualcuno di nuovo: ing?

public static class HardCodedRoles 
{ 
    public const string Managers = "Managers"; 
    public const string Administrators = "Administrators"; 
} 

[RequiresRole(HardCodedRoles.Managers)] 
+0

Sì !!! Questa è la soluzione !!!! Accidenti! È facile!!! :))) –

+1

Questo non impedisce a qualcuno di usare '[RequiresRole (" fred ")]' comunque. È sufficiente? –

2

La ragione che si vede l'errore è dovuto al fatto ToString() è un metodoe quindi il valore non può essere calcolato al momento della compilazione.

Se è possibile utilizzare [RequiresRole (HardCodedRoles.Managers)], è possibile eseguire lo ToString altrove nel codice e questo potrebbe fornire la funzionalità necessaria. Ciò richiederà la modifica del parametro dell'attributo da string a HardCodedRoles.

(mi immagino che l'utilizzo di un const non funziona, perché il tipo di parametro sarà ancora string, quindi l'ingresso non sarà limitato.)

+1

Grazie! Potresti fornire qualsiasi esempio di "Se puoi utilizzare [RequiresRole (HardCodedRoles.Managers)], puoi eseguire ToString altrove nel tuo codice, e questo potrebbe darti la funzionalità di cui hai bisogno." –

+0

Cosa ti serve un campione di? –

+0

Oh no grazie! Ho già una risposta. –

1

Si potrebbe anche utilizzare la parola chiave nameof, cioè .:

[RequiresRole(nameof(HardCodedRoles.Managers))] 
Problemi correlati