2013-04-02 19 views
13

私はこのように、任意の外部メソッドを実行するクラスを持つようにしたい:委任 - C#

class CrazyClass 
{ 
    //other stuff 

    public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod) 
    { 
    //more stuff 
    return Method(ParametersForMethod) //or something like that 
    } 
} 

が可能、このですか?任意のメソッドシグニチャをとるデリゲートがありますか?

+1

は、どのようにそれに何のパラメータを渡すために知っているのだろうか?パラメータの数とタイプについて間違っていると思われる場合、どうしたらよいでしょうか? – Servy

答えて

26

あなたはFunc<T>とクロージャによって異なる方法でこれを行うことができます。

public T Execute<T>(Func<T> method) 
{ 
    // stuff 
    return method(); 
} 

に発信者を、それを実装するためにクロージャを使用することができます。

var result = yourClassInstance.Execute(() => SomeMethod(arg1, arg2, arg3)); 

ここでの利点は、あなたがコンパイラを許可することですあなたのために頑張ってください。メソッドの呼び出しと戻り値はすべてタイプセーフです。インテリセンスなどを提供します。

+1

それはそうです....明確です。 –

+0

CrazyClassのコンストラクタでこれを行うことはできますか?もしそうなら、どうですか? – toddmo

+0

@toddmo - あなたがそれをしたいなら、CrazyClassを一般的にする必要があります。 –

0

私はあなたがリフレクションこの場合は、あなたが質問にを求め正確に何を得るでしょうとして - 任意の方法(静的またはインスタンス)、任意のパラメータ:

public object Execute(MethodInfo mi, object instance = null, object[] parameters = null) 
{ 
    return mi.Invoke(instance, parameters); 
} 

それはSystem.Reflection.MethodInfoクラスです。

3

Kindaはなぜ最初にこのことをしたいのかによって決まります...私はFraz genericを使ってCrazyClassがまだパラメータを知らないようにします。

class CrazyClass 
{ 
    //other stuff 

    public T Execute<T>(Func<T> Method) 
    { 
     //more stuff 
     return Method();//or something like that 
    } 


} 

class Program 
{ 
    public static int Foo(int a, int b) 
    { 
     return a + b; 
    } 
    static void Main(string[] args) 
    { 
     CrazyClass cc = new CrazyClass(); 
     int someargs1 = 20; 
     int someargs2 = 10; 
     Func<int> method = new Func<int>(()=>Foo(someargs1,someargs2)); 
     cc.Execute(method); 
     //which begs the question why the user wouldn't just do this: 
     Foo(someargs1, someargs2); 
    } 
} 
0
public static void AnyFuncExecutor(Action a) 
{ 
    try 
    { 
     a(); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
}