2009-12-09 24 views
9

私はパラメータとして別のメソッドを受け入れるが、特定のシグネチャにロックされたくないメソッドを書くことに興味があります。私はメソッドが呼び出されたときに例外をスローするかどうかだけに興味があります。任意のデリゲートをパラメータとして受け入れることができる.NET Frameworkに構造体がありますか?デリゲートをパラメータとして受け入れる方法

たとえば、次のすべてのコールは、(オーバーロードを使用せずに!)動作するはずです:

DoesItThrowException(doSomething(arg)); 
DoesItThrowException(doSomethingElse(arg1, arg2, arg3, arg4, arg5)); 
DoesItThrowException(doNothing()); 
+0

どのようにメソッドが例外をスローするかどうかを確認するためにテストしていますか? 'try'-' catch 'ブロックに貼り付けることを計画していて、それを呼び出すつもりなら、あなたはまだそれをパラメータに指定する必要があります。 –

答えて

3
bool DoesItThrowException(Action a) 
{ 
    try 
    { 
    a(); 
    return false; 
    } 
    catch 
    { 
    return true; 
    } 
} 

DoesItThrowException(delegate { desomething(); }); 

//or 

DoesItThrowException(() => desomething()); 
10

あなたはそれを引数を与えない限り、あなたはそれを呼び出すことはできません。あなたが署名を知らない限り、それを議論することはできません。これを回避するために、私は、発信者にその負担をかけるだろう - そうでなければ私はActionとアノン・メソッド/ラムダを使用することになり、すなわち

DoesItThrowException(FirstMethod); // no args, "as is" 
DoesItThrowException(() => SecondMethod(arg)); 
DoesItThrowException(() => ThirdMethod(arg1, arg2, arg3, arg4, arg5)); 

、あなたはDelegateDynamicInvokeを使用することができますが、それは遅いですし、あなたがする必要がありますどのような引数を与えるか知っている。

public static bool DoesItThrowException(Action action) { 
    if (action == null) throw new ArgumentNullException("action"); 
    try { 
     action(); 
     return false; 
    } catch { 
     return true; 
    } 
} 
+0

質問に示されているような構文では、ラムダだけが実行可能な選択肢であることは明らかです。つまり、すべてのパラメータをバインドしたメソッドと同じように、デリゲートを本当に渡す必要はありません。 –

+0

@Pavel:構文の抽象化を可能にするSchemeのような、より良い言語が必要です。 – leppie

+0

「より良い」というだけでなく「より良い」というのはなぜですか?スキームは本当に良いです。 –

関連する問題