2013-08-20 15 views
11

Ist es möglich, eine Methode zu erstellen, die ANY-Methode (unabhängig von ihren Parametern) als Parameter akzeptiert? Die Methode würde auch einen params Parameter haben, der dann alle Parameter für die Parameter-Methode übernimmt.C# Beliebige Funktion als Parameter

Also im Grunde, was ich will, ist so etwas wie diese:

public void CallTheMethod(Action<int> theMethod, params object[] parameters) 

Aber dann für jede Methode, nicht nur für die Methoden, die einen int nehmen.

Ist so etwas möglich?

Dank

+6

Nun, Sie unspezifischer 'Delegate' passieren könnte, aber' DynamicInvoke' ist * sloooooowwwwww * (Relativ gesehen) –

+5

Nur aus Neugier, wie wäre das nützlicher, als die Methode direkt aufzurufen? Ich muss sagen, ich bin fasziniert obwohl –

+1

Aus Neugier, was ist der Sinn dieser? Es scheint sehr fehleranfällig zu sein. Warum nicht einfach die Methode ausführen? – Dennisch

Antwort

6

Ja, mit einem Delegierten:

public object CallTheMethod(Delegate theMethod, params object[] parameters) 
{ 
    return theMethod.DynamicInvoke(parameters); 
} 

Aber sehen Marc Gravell's comment auf Ihre Frage :)

Well, you could pass the non-specific Delegate , but DynamicInvoke is sloooooowwwwww (relatively speaking)

+1

Ich kann es nicht funktionieren lassen. Ich erhalte eine Fehlermeldung: "Konvertierung von 'Methodengruppe' in 'System' nicht möglich.Delegate '". Was ich habe ist eine Methode" DoSomething (int-Nummer); "Und dann Ihre Methode. Also habe ich versucht" CallTheMethod (DoSomething, 5) "und dann bekomme ich den Fehler ... Mache ich etwas falsch, oder Gibt es einen Haken, von dem ich nichts weiß? –

5

Es ist möglich, aber nicht das, was getan werden sollte. Diese

ist, was ich tun würde:

public void CallTheMethod(Action toCall) 

Sie könnten "huh" gehen. Im Grunde, was es erlaubt es dem Benutzer zu tun, ist dies:

CallTheMethod(() => SomeOtherMethod(with, some, other, parameters)); 

jedoch, wenn Sie es wollen, eine Art Rückkehr, es beinhaltet Generika:

public void CallTheMethod<T>(Func<T> theMethod) 

Sie können auf diese Art generische Einschränkungen setzen, tun was auch immer Sie damit wollen, etc.

+0

Sehr wahr, was ich frage, scheint nicht gut zu sein. Obwohl Unity den Namen einer Methode verlangt, wenn sie einen RPC aufruft wenig Wrapper, also muss ich den Methodennamen nicht fest codieren Könnten Sie sich auch den Kommentar zu Matten's Antwort ansehen? Sie scheinen sehr gut über C# Bescheid zu wissen. Danke! –

3

Ja. Sie können DynamicInvoke verwenden, die Methoden zu nennen:

Action<int> method1 = i => { }; 
Func<bool, string> method2 = b => "Hello"; 

int arg1 = 3; 
bool arg2 = true; 
//return type is void, so result = null; 
object result = method1.DynamicInvoke(arg1); 

//result now becomes "Hello"; 
result = method2.DynamicInvoke(arg2); 

Eine Methode, dies zu tun würde:

object InvokeMyMethod(Delegate method, params object[] args) 
{ 
    return method.DynamicInvoke(args); 
} 
Verwandte Themen