Ich brauche eine Methode, die eine MethodInfo
Instanz übernimmt, die eine nicht-generische statische Methode mit beliebiger Signatur darstellt und einen an diese Methode gebundenen Delegaten zurückgibt, der später mit der Methode Delegate.DynamicInvoke
aufgerufen werden kann. Meine erste naive Versuch sah wie folgt aus:Wie erstelle ich einen Delegaten aus einer MethodInfo, wenn die Methodensignatur nicht vorher bekannt sein kann?
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.
}
}
Ich hoffte, dass die MethodInfo.CreateDelegate
Methode den Typ richtig delegieren herausfinden konnte selbst. Nun, offensichtlich kann es nicht. Wie erstelle ich eine Instanz von System.Type
, die einen Delegaten mit einer Signatur darstellt, die der angegebenen MethodInfo
Instanz entspricht?
Warum wollen Sie versuchen, einen Delegierten erstellen und DynamicInvoke verwenden? DynamicInvoke ist viel langsamer als MethodInfo.Invoke. –
@ Nawfal Nö. Ein Duplikat erfordert, dass die hier gestellte Frage in der von Ihnen genannten Frage beantwortet werden kann. Der Fragesteller möchte 'MethodInfo.CreateDelegate()' verwenden können, wenn der Typ, der die Methodensignatur darstellt, nicht bekannt ist. In der anderen Frage ist dies bereits bekannt als "MyDelegate" und ist daher für das Problem dieses Fragestellers nicht hilfreich. – einsteinsci
Wer zum Teufel löscht meine Kommentare? Nicht das erste Mal! Sorry @einsteinsci Ich kann den Thread, den ich hier gepostet habe, nicht als Duplikat finden, also kann ich nicht inspizieren. Wenn Sie schreiben könnten, würde ich mich freuen. – nawfal