2010-12-07 15 views
2

ist mein Ziel mit dem folgenden Code demostrated:generische Methode mit Delegattyp

void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate 
{ 
    aMethod.Invoke(aParams); 
} 

Wie kann ich tun, um diese Art der Sache?

Antwort

2

Sie könnten Unconstrained Melody verwenden - oder kneifen Sie das Bit, das dies ermöglicht.

Auf der anderen Seite, das wird nicht tatsächlich eine Invoke Methode freilegen. Was möchten Sie tun, was nicht möglich ist mit:

void MyMethod(Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

? Ich meine, würden Sie nicht wirklich kompilieren Zeit haben Sicherheit auch mit der generischen Version, da die Parameter der falschen Typen sein könnte usw.

+0

Ich hatte irgendwie gehofft, Parameter Typ Sicherheit zu bekommen. – Max

+0

@Max: Warum rufen Sie die Methode dann nicht direkt auf? Ich sehe nicht, was dich das wirklich kauft. –

+0

Ich möchte den allgemeinen Code für die Ausnahmebehandlung extrahieren. try {invoke} catch (1) {} catch (2) {} ... – Max

0

T muss ein Typ sein, aber Sie brauchen keine Generika

void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

void Print(params object[] output) 
{ 
    foreach (var o in output) 
     Console.WriteLine(o); 
} 

nennen es wie folgt aus:

MyMethod(Print, 1, "Hello"); 
+0

Dies funktioniert nicht für Delegaten ohne Parameter (MethodInvoker). – Max

1

ich bin nicht sicher, was Sie tatsächlich zu erreichen versucht: Da nur der Compiler oder Laufzeit von System.Delegate erben kann, welchem ​​Punkt die allgemeine haben über:

Nun, wenn Sie versuchen, etwas schwierig mit Delegate Typ Einschränkungen zu tun, können Sie sich http://code.google.com/p/unconstrained-melody/, die einige il Neuschreiben, damit Sie es tun können.

Oder nur ein Action<object[]> verwenden - oder viele Überlastungen mit Action<T>, Action<T1,T2> usw.

void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

//or 
void MyMethod<T>(Action<T> aMethod, T param) 
{ 
    aMethod(param); 
} 

void MyMethod<T1, T2>(Action<T1, T2> aMethod, T1 param1, T2 param2) 
{ 
    aMethod(param1, param2); 
} 

ich wirklich nicht, wie die riesige Liste von Überlastungen, aber in manchen Fällen sind sie die beste Bibliothek Benutzerfreundlichkeit.