2010-11-10 23 views
1

Est-il possible d'écrire une classe personnalisée qui étend la classe .NET Attribute afin que je puisse appliquer cette classe à une méthode et .NET Framework appelle mon constructeur de classe avant d'exécuter cette méthode. Voici l'exemple.blocage de classes d'attributs .NET

public class TestAttribute : Attribute 
{ 
    public TestAttribute() 
    { 
     Console.WriteLine("Called"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestMethod(); 
    } 

    [TestAttribute()] 
    public static void TestMethod() 
    { 

    } 

} 

Je veux quand TestMethod est appelée, framework exécutera le constructeur TestAttribute().

Répondre

2

Les attributs .NET classiques ne provoquent pas d'invocation de magie, sauf pour un ensemble très limité d'attributs système (sécurité, etc.). Le reste est appliqué seulement par inspection par réflexion, ce qui doit être fait explicitement. Vous pourriez regarder PostSharp (maintenant renommé en commercial product).

+0

Une autre option (uniquement ASP.NET MVC) est une sous-classe de crée 'ActionFilterAttribute'. Voir un exemple [ici] (http://www.davidhayden.com/blog/dave/archive/2008/03/21/ActionFilterAttributeExamplesASPNETMVCFrameworkPreview2.aspx). – rsenna

+0

@rsenna c'est un exemple très spécifique qui est toujours invoqué par la réflexion. –

+0

@Marc Gravell: 1) C'est pourquoi je l'ai ajouté comme un commentaire, pas comme une réponse. 2) Il fait le travail (l'OP veut ajouter le comportement d'exécution à une méthode, je ne pense pas qu'il/elle se soucie des détails d'exécution). 3) Je vous ai donné un +1, alors ne vous plaignez pas! ;-) – rsenna

1

Je ne crois pas - Les attributs ne sont lus que par des éléments reflétant le code, ils ne sont pas appelés pendant l'exécution normale.

0

Oui c'est possible, mais pas tel quel.

Vous pouvez le faire en utilisant la programmation orientée aspect. PostSharp est un framework qui vous permet de faire cela; cela vous permet de "tisser" des aspects dans le code au moment de la compilation.

Postsharp

[Serializable] 
public class TestAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation() 
    { 
     Console.WriteLine ("TestAttribute called"); 
     base.OnInvocation(); 
    } 
}