2012-08-29 12 views
6

Solo quiero usar "Administradores" para cada atributo y usar alguna enumeración para eso.Usa el nombre del elemento enum como un parámetro de atributo

¿Pero parece que es imposible o estoy equivocado?

Así que tratar de reemplazar

[RequiresRole("Managers")] 

con

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

... 

public enum HardCodedRoles 
{ 
      Administrators, 
      Managers 
} 
+1

¿Es posible añadir más detalle para que sepamos qué es lo que está tratando de lograr? – Maciej

+0

Simplemente no quiero usar la cadena "AnyRoleName" y quiero poner algún elemento de enum en lugar de él. Pero VS da un error. Un argumento de atributo debe ser una expresión constante, un tipo de expresión o una expresión de creación de matriz de un tipo de parámetro de atributo –

+1

si HardcodedRoles.Managers es una cadena const, esto funcionaría. Por otro lado, si HardcodedRoles es una enumeración, deberá crear una subclase de AuthorizeAttribute e implementar la suya propia, pasando HardcodedRoles y/o HardcodedRoles [] al constructor. – Maciej

Respuesta

11

¿Qué tal una clase en lugar de una enumeración , haciendo la clase estática para evitar a alguien nuevo: ing it?

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

[RequiresRole(HardCodedRoles.Managers)] 
+0

¡Sí! Esta es la solución !!!! ¡Maldición! ¡¡¡Es fácil!!! :))) –

+1

Eso no impide que alguien use '[RequiresRole (" fred ")]' embargo. ¿Eso es suficiente? –

2

La razón por la que se ve el error se debe a que ToString() es un métodoy por lo tanto el valor no se puede calcular en tiempo de compilación.

Si puede usar [RequiresRole (HardCodedRoles.Managers)] en su lugar, puede realizar el ToString en otro lugar de su código, y esto podría darle la funcionalidad que necesita. Esto requerirá que cambie el parámetro de su atributo de string a HardCodedRoles.

(me imagino que el uso de un const no va a funcionar, porque el tipo del parámetro seguirá siendo string, por lo que la entrada no será restringida.)

+1

¡Gracias! ¿Podría proporcionar alguna muestra de "Si puede usar [RequiresRole (HardCodedRoles.Managers)] en su lugar, puede realizar el ToString en otro lugar de su código, y esto podría darle la funcionalidad que necesita." –

+0

¿Qué necesita una muestra? ¿de? –

+0

¡Oh, no, gracias! Ya tengo una respuesta. –

1

También puede utilizar la palabra clave nombredel, es decir .:

[RequiresRole(nameof(HardCodedRoles.Managers))] 
Cuestiones relacionadas