2011-11-13 9 views
1

Varメソッド入力のメソッド? C#ので

入力パラメータは、任意の方法あるメソッドを定義することが可能ですか?これは、メソッドを取得し、スロー例外またはではありませんブール値を返す私は署名

bool IsDoit(var method) 
{ 
    try 
    { 
     method(...); 
     return true; 
    } 
    catch{return false;} 
} 

と方法をしたい

は私より良い説明をしましょう!

一般委任?ジェネリックアクション?一般的な機能ですか?

あなたは何か考えているか、がありません

+0

代わりにブール値を、リターンExceptionオブジェクトが優れていますアイデア –

答えて

7

「...」はここに入りますか?何らかの説明の代理人が欲しいと思うように思えます。その代理人の署名は、あなたが呼びたいメソッドのものと一致する必要があります。任意のパラメータなしのvoidメソッドのためのメソッドグループの変換が可能になります

static bool IsDoit(Action method) 
{ 
    try 
    { 
     method(); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

if (IsDoIt(SomeMethodWithNoParameters)) 
{ 
} 

呼び出し側が他のパラメータを取るメソッドを呼び出したい場合、彼らはラップするラムダ式を使用することができる。例えばそれはActionに:

if (IsDoIt(() => MethodWithParameters("first", "second")) 
{ 
} 

個人的に私はすべての必ずこの設計の知恵についてではありませんよまず最初に、例外をキャッチして、何も記録せずにそれらを飲み込むことは、本当に悪い考えです。

+0

私はあなたに例外をキャッチし、それらを飲み込むことについて同意します。あなたの考えに感謝します。 –

+0

@RedHat: 'Exception'がすでに参照型であることを除いて、' Nullable 'と書くことはできません。しかし、私はまだこれを阻止しています。例外を処理する慣習的な方法は、返されるのではなくスローされることです。適切な場合があるかもしれませんが、かなり珍しいことを示唆しています。 –

1

はい、パラメータのないメソッドの場合は、varActionに置き換えてください。

1

あなたがアクションを使用して例えば代理人としてあなたの方法を渡すことができます。

bool IsDoit(Action test) 
{ 
    test(...); 
} 
1

あなたは常にジェネリックデリゲートを受け入れることができます。代表団はすべて、あなたは少しタイプの消去を気にしない場合、あなたは

public delegate R DelegParams<R>(params object[] @params); 
public static void AcceptAny<R>(DelegParams<R> paramsFunc) { /**/ } 

あなたは間接的割り当てるには、ラムダ式を使用してこの署名にほとんどすべてのデリゲートことができSystem.Delegate

using System; 

public class Program 
{ 
    public delegate R Deleg1<R,T1>(T1 arg); 
    public delegate R Deleg2<R,T1,T2>(T1 arg1, T2 arg2); 
    public delegate R Deleg3<R,T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3); 

    public static void AcceptAny<R,T1>(Deleg1<R,T1> del) { /**/ } 
    public static void AcceptAny<R,T1,T2>(Deleg2<R,T1,T2> del) { /**/ } 
    public static void AcceptAny<R,T1,T2,T3>(Deleg3<R,T1,T2,T3> del) { /**/ } 

    public static void Main(string[] args) 
    { 
    } 
} 

から派生しますそれを包みます(Jon Skeetが示すActionのようなアプローチ)。デリゲートは、共通の基本クラスを共有し、あなたは「反射様」のインタフェース(パラメータ、例えばとして一般的なobject[]を取る)を使用して、それらを呼び出すことができるようにすることを

注:Delegate.DynamicInvoke Method

関連する問題