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

Schreibe einen Kommentar