2013-04-02 16 views
13

voglio avere una classe che eseguirà qualsiasi metodo esterno, in questo modo:Delegato per qualsiasi tipo di metodo - C#

class CrazyClass 
{ 
    //other stuff 

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

è possibile? C'è un delegato che prende una firma del metodo?

+1

come si può sapere quali parametri da passare ad esso? Cosa dovrebbe accadere se si indovina il numero e il tipo di parametri errati? – Servy

risposta

26

Si può fare questo un modo diverso da Func<T> e chiusure:

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

Il chiamante può quindi utilizzare le chiusure per la sua attuazione:

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

Il vantaggio è che si consente al compilatore di fai il duro lavoro per te, e le chiamate al metodo e il valore restituito sono tutti sicuri, forniscono intellisense, ecc.

+1

È così .... chiaro. –

+0

Possiamo farlo nel costruttore di CrazyClass? Se é cosi, come? – toddmo

+0

@toddmo - Avresti bisogno di rendere CrazyClass generico se volessi farlo. –

0

Penso che tu stia meglio usando i riflessi in questo caso, come si ottiene esattamente quello che hai chiesto per la questione - qualsiasi metodo (statico o istanza), tutti i parametri:

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

E 'System.Reflection.MethodInfo classe.

3

Un po 'dipende dal motivo per cui si desidera eseguire questo in primo luogo ... Vorrei farlo utilizzando il Func generico in modo che la CrazyClass possa ancora ignorare i parametri.

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; 
    } 
} 
Problemi correlati