2009-08-07 1 views
1

.NETのConditional Attributeでは、コンパイル時にメソッドの呼び出しを無効にすることができます。私は基本的に同じ正確なことを、実行時に探しています。私はAOPフレームワークにこのようなものがあるはずですが、私はその名前が分からないので、サポートされているかどうかわかりません。実行時に属性を使用してメソッド呼び出しを条件付きで制御できますか?

ですから、例えば、私はこの

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

ような何かをしたいと思いますので、これまでのコードでMメソッドの呼び出しがある場合、それは最初RuntimeConditionalを呼び出して渡すでしょうボブMを実行するかどうかを決定します。

+0

あなたの例では、どのようなコードでMを実行できますか?どのようなコードで実行されないのですか?代わりに何が起こると思いますか? – Stobor

+0

RuntimeConditionalメソッドは、実行するかどうかを制御します。現在、Bobはハードコードされているので、常に実行されます。 RuntimeConditionalメソッドの文字列Bobは、メソッドが呼び出されるかどうかを調べるために、設定ファイル/データベースフィールドから引き出すためのコードに置き換えられます。 – Bob

+0

Trace属性のOnEntryオーバーライドに例外をスローするだけで済みます。あなたが探していたものではありませんが、メソッドが実行されなくなります。 –

答えて

5

あなたが実際にあなたがやりたいPostSharpを使用することができます。ここで

は、あなたが使用できる簡単な例です:

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

それとも、あなただけのメソッドが実行される「前に」を見ていることから、あなたは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 
     } 
    } 
} 

をメソッドに戻り値がある場合、それらも処理できます。 eventArgsには、設定可能なreturnValueプロパティがあります。

+0

甘い、ありがとう! FlowBehaviorは私が望むものです – Bob

+0

Cool。私はちょうど私が論理をうんざりしたことに気づいたが、あなたはFlowBehaviourを望む。条件が満たされていなければ返す。 –

0

私は、これはあなたが説明したものを行うための非常に簡単な方法だろうと信じて:

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

おかげ

+0

ええ、それはしかし、属性を使用していません。 – Bob

関連する問題