2010-03-29 18 views
4

Je suis en train d'accéder à un attribut personnalisé appliqué à une méthode dans un intercepteur du château, par exemple:attribut accès personnalisé sur la méthode de intercepteur château de Windsor

[MyCustomAttribute(SomeParam = "attributeValue")] 
public virtual MyEntity Entity { get; set; } 

en utilisant le code suivant:

internal class MyInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     if (invocation.Method.GetCustomAttributes(typeof(MyCustomAttribute), true) != null) 
     { 
      //Do something 
     } 
    } 
} 

L'intercepteur déclenche OK lorsque la méthode est appelée mais ce code ne renvoie pas l'attribut personnalisé. Comment puis-je atteindre cet objectif?

+0

quelle version de DynamicProxy utilisez-vous? –

+0

J'utilise la version 2.1 –

Répondre

1

Je pense que je l'ai compris - c'est à cause de la différence entre la propriété et la méthode. C'est la méthode get_ qui déclenche l'intercepteur, et celle-ci n'est pas décorée avec l'attribut de la propriété parent.

+0

Y a-t-il une solution de contournement? – danyolgiax

4

Essayez Attribute.GetCustomAttribute(...) méthode statique pour cela. C'est bizarre mais ces deux méthodes retournent des résultats différents parfois pour une raison étrange.

+0

Oui, ça a marché comme un charme. Merci! –

+0

Merci mon ami, j'ai couru dans ce bug aujourd'hui et allais bananes jusqu'à ce que votre poste sauvé le jour. La méthode statique fonctionne, comme vous le dites, tout comme le générique 'GetCustomAttribute ()'. Malheureusement, ce dernier n'est présent que dans .NET 4.5. –

+0

Juste vu que http://msdn.microsoft.com/en-us/library/dwc6ew1d%28v=vs.110%29.aspx indique que _ "Cette méthode ignore le paramètre inherit pour les propriétés et les événements. chaîne pour les attributs sur les propriétés et les événements, utilisez les surcharges appropriées de la méthode Attribute.GetCustomAttributes. "_ Conception très incohérente IMHO. –

3

Essayez

private static Attribute getMyCustomAttribute(IInvocation invocation) 
{ 
    var methodInfo = invocation.MethodInvocationTarget; 
    if (methodInfo == null) 
    { 
     methodInfo = invocation.Method; 
    } 
    return Attribute.GetCustomAttribute(methodInfo, typeof(MyCustomAttribute), true); 
} 
+1

var methodInfo = invocation.MethodInvocationTarget ?? invocation.Method; – Soren