2009-07-24 12 views
5

Duplicar posible:
Why does my .NET Attribute not perform an action?C# ejecutar código en el interior de atributo personalizado

Hola,

Esto puede soundlike una pregunta muy tonta y que no saben lo que es posible aquí como todo los tutoriales de "atributos personalizados" en la red son prácticamente los mismos y no abordan lo que quiero hacer. He visto un código por ahí donde el código está escrito dentro de las clases de atributos, por ejemplo: Logging with ASP.NET MVC Action Filters y me pregunto cómo se ejecuta este código alguna vez.

Si tengo por ejemplo el siguiente código:

public class Test 
{ 
    [RestrictedAttribute("RegisteredMember")] 
    public void DoSomething() 
    { 
     //this code can only be executed if the logged-in user 
     //is a member of the RegisteredMember group 
    } 
} 

A continuación, el atributo personalizado RestrictedAttribute sería algo como esto:

[AttributeUsage(AttributeTargets.Method)] 
public class RestrictedAttribute : System.Attribute 
{ 
    /// <summary> 
    /// Make this code restricted to users with a required role 
    /// </summary> 
    /// <param name="requiredRole">The role required to execute this method</param> 
    public RestrictedAttribute(string requiredRole) 
    { 
     //validate if member is in role, else throw exception 
     throw new MemberNotInRoleException(requiredRole); 
    } 
    public new string ToString() { 
     return "Access needs to be granted"; 
    } 

} 

Ahora el problema es que no puedo conseguir el MemberNotInRoleException para ser lanzado cuando ejecuto el método Test.DoSomething().

Tal vez estoy perdiendo todo el concepto de atributos personalizados, no dude en explicarlo.

+0

Dupe: http://stackoverflow.com/questions/1164978/c-attribute-actions-and-instance-values ​​ –

+2

Necesita heredar su atributo de ActionFilterAttribute y anular el método OnActionExecuting para que haga algo en MVC . –

+1

No creo que esto sea un engaño exacto, ya que es el comportamiento MCV lo que está nublando el problema, la referencia de Mehrdad aborda los atributos directamente y es una buena decisión, pero hay un matiz aquí que puede ayudar a los MVC a abordar el corte transversal preocupaciones en sus soluciones, como la validación, y la serialización JSON/XML. –

Respuesta

2

La forma en que está mirando los atributos suena bien al principio, pero piénselo nuevamente. Lo que realmente estás haciendo es decorar tu clase o lo que sea para que algo que funcione con ella pueda tomar una decisión, no para que la clase pueda tomar una decisión. Esto se me nubló por la forma en que puedes usar los atributos actionfilter en MVC, que parecen hacer algo, pero es el marco el que selecciona los eventos y usa el atributo en consecuencia. Normalmente trato de pensar en los atributos como comentarios para que mi programa funcione.

Cuestiones relacionadas