Wie erstelle ich einen Delegaten aus einer MethodInfo, wenn die Methodensignatur nicht vorher bekannt sein kann?
Brauche ich eine Methode, die eine MethodInfo
Instanz repräsentiert eine nicht-generische statische Methode mit beliebigen Signatur und gibt einen Delegaten gebunden, die Methode, die später aufgerufen werden, mit Delegate.DynamicInvoke
Methode. Mein Erster naiver Versuch sah so aus:
using System;
using System.Reflection;
class Program
{
static void Main()
{
var method = CreateDelegate(typeof (Console).GetMethod("WriteLine", new[] {typeof (string)}));
method.DynamicInvoke("Hello world");
}
static Delegate CreateDelegate(MethodInfo method)
{
if (method == null)
{
throw new ArgumentNullException("method");
}
if (!method.IsStatic)
{
throw new ArgumentNullException("method", "The provided method is not static.");
}
if (method.ContainsGenericParameters)
{
throw new ArgumentException("The provided method contains unassigned generic type parameters.");
}
return method.CreateDelegate(typeof(Delegate)); //This does not work: System.ArgumentException: Type must derive from Delegate.
}
}
Hoffte ich, dass die MethodInfo.CreateDelegate
Methode könnte herausfinden der richtigen Delegaten-Typ selbst. Nun, offensichtlich kann es nicht. Also, wie erstelle ich eine Instanz von System.Type
Vertretung eines Delegierten mit einer Signatur passend zu den bereitgestellten MethodInfo
Instanz?
InformationsquelleAutor der Frage Zakharia Stanley | 2013-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie System.Linq -.Ausdrücke.Ausdruck.GetDelegateType Methode:
Es ist wohl ein copy-paste-Fehler in der 2. Prüfung für
!method.IsStatic
- sollten Sie nicht verwendenArgumentNullException
es. Und es ist ein guter Stil, um eine parameter-name als argument anArgumentException
.Verwenden
method.IsGenericMethod
wenn Sie möchten, dass alle generische Methoden undmethod.ContainsGenericParameters
wenn Sie ablehnen möchten nur generische Methoden haben unsubstituted Typ-Parameter.InformationsquelleAutor der Antwort Oksana Gimmel
Möchten Sie vielleicht, um zu versuchen, System.LinQ -.Ausdrücke
und verwenden Sie es später als folgende
InformationsquelleAutor der Antwort Khoa Nguyen