2009-08-07 5 views
1

Le Conditional Attribute dans .NET vous permet de désactiver l'invocation de méthodes au moment de la compilation. Je cherche essentiellement la même chose, mais au moment de l'exécution. J'ai l'impression que quelque chose comme ça devrait exister dans les frameworks AOP, mais je ne connais pas le nom, donc j'ai du mal à comprendre si c'est supporté.Puis-je conditionnellement contrôler les appels de méthode à l'exécution avec des attributs?

Donc, comme un exemple que je voudrais faire quelque chose comme ça

[RuntimeConditional("Bob")] 
public static void M() { 
    Console.WriteLine("Executed Class1.M"); 
} 

//..... 

//Determines if a method should execute. 
public bool RuntimeConditional(string[] conditions) { 
    bool shouldExecute = conditions[0] == "Bob"; 

    return shouldExecute; 
} 

Alors, où jamais dans le code il y a un appel à la méthode M, il faudrait d'abord appeler RuntimeConditional et passer Bob pour déterminer si M doit être exécuté.

+0

Dans votre exemple, quel type de code rendrait M exécutable? Quel genre de code le ferait ne pas exécuter, et qu'attendriez-vous à la place? – Stobor

+0

La méthode RuntimeConditional contrôlerait si elle serait exécutée. En ce moment, Bob est codé en dur, donc il sera toujours exécuté. La chaîne Bob dans la méthode RuntimeConditional serait remplacée par du code à extraire d'un champ de fichier de configuration/base de données pour voir si la méthode devrait être appelée ou non. – Bob

+0

Vous pouvez simplement lancer une exception dans le remplacement OnEntry de l'attribut Trace. Pas tout à fait ce que vous cherchiez, mais cela arrêtera votre méthode d'exécution. –

Répondre

5

Vous pouvez réellement utiliser PostSharp pour faire ce que vous voulez.

Voici un exemple simple, vous pouvez utiliser:

[Serializable] 
public class RuntimeConditional : OnMethodInvocationAspect 
{ 
    private string[] _conditions; 

    public RuntimeConditional(params string[] conditions) 
    { 
     _conditions = conditions; 
    } 

    public override void OnInvocation(MethodInvocationEventArgs eventArgs) 
    { 
     if (_conditions[0] == "Bob") // do whatever check you want here 
     { 
      eventArgs.Proceed(); 
     } 
    } 
} 

Ou, puisque vous êtes juste regarder « avant » la méthode exécute, vous pouvez utiliser le OnMethodBoundaryAspect:

[Serializable] 
public class RuntimeConditional : OnMethodBoundaryAspect 
{ 
    private string[] _conditions; 

    public RuntimeConditional(params string[] conditions) 
    { 
     _conditions = conditions; 
    } 

    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     if (_conditions[0] != "Bob") 
     { 
      eventArgs.FlowBehavior = FlowBehavior.Return; // return immediately without executing 
     } 
    } 
} 

Si votre les méthodes ont des valeurs de retour, vous pouvez les gérer aussi. eventArgs a une propriété returnValue qui est réglable.

+0

Doux, merci! FlowBehavior est ce que je voulais – Bob

+0

Cool. Bien que je viens de réaliser que j'ai mué la logique - vous voulez FlowBehaviour.Return si la condition est * pas * rencontré. –

0

Je crois que ce serait un moyen très simple de faire ce que vous avez décrit:

public static void M() 
{ 
    if (RuntimeConditional("Bob")) 
    { 
     Console.WriteLine("Executed Class1.M"); 
    } 
} 

Merci

+0

Ouais, ça n'utilise pas d'attributs. – Bob

Questions connexes