2009-08-07 8 views
1

Die Conditional Attribute in .NET ermöglicht es Ihnen, den Aufruf von Methoden zur Kompilierzeit zu deaktivieren. Ich suche nach genau der gleichen Sache, aber zur Laufzeit. Ich habe das Gefühl, dass so etwas in AOP-Frameworks existieren sollte, aber ich kenne den Namen nicht, also habe ich Probleme herauszufinden, ob es unterstützt wird.Kann ich Methodenaufrufe zur Laufzeit mit Attributen bedingt steuern?

So als Beispiel würde Ich mag so etwas wie diese

[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; 
} 

Also, wo immer im Code tun, es ist ein Aufruf an die M Methode wäre es nennt erst RuntimeConditional und übergibt Bob um festzustellen, ob M ausgeführt werden sollte.

+0

In Ihrem Beispiel, welche Art von Code würde M ausführen? Welche Art von Code würde dazu führen, dass sie nicht ausgeführt wird und was würden Sie stattdessen erwarten? – Stobor

+0

Die RuntimeConditional-Methode würde steuern, ob sie ausgeführt werden würde. Im Moment ist Bob fest codiert, also wird es immer ausgeführt. Die Zeichenfolge Bob in der RuntimeConditional-Methode wird durch Code ersetzt, der aus einem Konfigurationsdatei-/Datenbankfeld abgerufen wird, um zu ermitteln, ob die Methode aufgerufen werden soll oder nicht. – Bob

+0

Sie könnten einfach eine Ausnahme in der OnEntry-Überschreibung des Trace-Attributs auslösen. Nicht ganz das, wonach du gesucht hast, aber es wird deine Methode davon abhalten, ausgeführt zu werden. –

Antwort

5

Sie tatsächlich PostSharp verwenden können, um zu tun, was Sie wollen.

Hier ist ein einfaches Beispiel, das Sie verwenden können:

[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(); 
     } 
    } 
} 

Oder, da Sie suchen nur auf „vor“ das Verfahren ausführt, können Sie die OnMethodBoundaryAspect verwenden:

[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 
     } 
    } 
} 

Wenn Ihr Methoden haben Rückgabewerte, mit denen Sie auch umgehen können. eventArgs hat eine returnValue Eigenschaft, die einstellbar ist.

+0

Süß, danke! FlowBehavior ist was ich wollte – Bob

+0

Cool. Obwohl ich gerade realisiert habe, dass ich die Logik muckle - du willst FlowBehaviour.Return, wenn die Bedingung * nicht * erfüllt ist. –

0

Ich glaube, dies eine sehr einfache Art und Weise zu tun wäre, was Sie beschrieben:

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

Dank

+0

Ja, das verwendet jedoch keine Attribute. – Bob

Verwandte Themen