2010-03-17 9 views
2

Je code suivant:Accès attribut de méthode enveloppé dans C#

public static void ProcessStep(Action action) 
{ 
    //do something here 
    if (Attribute.IsDefined(action.Method, typeof(LogAttribute))) 
    { 
     //do something here [1] 
    } 
    action(); 
    //do something here 
} 

Pour une utilisation facile, j'ai quelques méthodes similaires en utilisant la méthode ci-dessus. Par exemple:

public static void ProcessStep(Action<bool> action) 
{ 
    ProcessStep(() => action(true)); //this is only example, don't bother about hardcoded true 
} 

Mais quand j'utilise la deuxième méthode (celle ci-dessus), même si l'attribut avait une action originale, le code [1] ne sera pas exécuté.

Comment puis-je savoir si la méthode est uniquement wrapper et si la méthode sous-jacente contient un attribut et comment accéder à cet attribut?

Répondre

3

Même si je suis sûr que vous pouvez utiliser les arbres d'expression, la meilleure solution serait de créer simplement une surcharge qui prend un paramètre supplémentaire de type MethodInfo et l'utiliser comme ceci:


public static void ProcessStep(Action<bool> action) 
{ 
    ProcessStep(() => action(true), action.Method); //this is only example, don't bother about hardcoded true 
} 
+0

Il est une autre situation quand je n'ai pas pensé solution assez évidente :) Merci :) Malheureusement, j'ai plus de méthodes similaires comme ProcessStep, ProcessStep , ProcessStep + TParams, et le code semble laid maintenant, donc je vais trouver une solution sans cet attribut. – prostynick

0

Eh bien, vous pourriez faire (Je ne pense pas nécessairement ce qui est bon code ...)

void ProcessStep<T>(T delegateParam, params object[] parameters) where T : class { 
    if (!(delegateParam is Delegate)) throw new ArgumentException(); 
    var del = delegateParam as Delegate; 
    // use del.Method here to check the original method 
    if (Attribute.IsDefined(del.Method, typeof(LogAttribute))) 
    { 
     //do something here [1] 
    } 
    del.DynamicInvoke(parameters); 
} 

ProcessStep<Action<bool>>(action, true); 
ProcessStep<Action<string, string>>(action, "Foo", "Bar") 

mais qui ne va pas vous gagner un concours de beauté.

Si vous pouviez donner un peu plus d'informations sur ce que vous essayez de le faire, il serait plus facile de donner des conseils utiles ... (car aucune des solutions sur ce look page vraiment mignon)