Erstellt einen Delegaten aus MethodInfo?

Nach googeln und landen auf SO und gelesen zu habendiese andere Frage

Ist es möglich, einen korrekten Delegaten aus einer MethodInfo zu erstellen?ob Sie kannten die Anzahl oder Arten von Parametern zum Zeitpunkt der Kompilierung nicht?

Mehr dazu: Kann dies elegant ohne den Einsatz von Reflection.Emit oder Type Buildern geschehen?

Dies ist für mich ein Kinderspiel, da ich bei Delegate.CreateDelegate den richtigen Delegate-Typ als ersten Parameter angeben muss, da ich sonst Ausnahmen auslösen oder eine falsche Methode aufrufen würde.

Ich baue ein paar Ninja-Zahnräder und das würde mir sehr helfen ... Danke!

Hier ist eine generische Lösung:

/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
    if (mi == null) throw new ArgumentNullException("mi");

    Type delegateType;

    var typeArgs = mi.GetParameters()
        .Select(p => p.ParameterType)
        .ToList();

    // builds a delegate type
    if (mi.ReturnType == typeof(void)) {
        delegateType = Expression.GetActionType(typeArgs.ToArray());

    } else {
        typeArgs.Add(mi.ReturnType);
        delegateType = Expression.GetFuncType(typeArgs.ToArray());
    }

    // creates a binded delegate if target is supplied
    var result = (target == null)
        ? Delegate.CreateDelegate(delegateType, mi)
        : Delegate.CreateDelegate(delegateType, target, mi);

    return result;
}

Hinweis: Ich erstelle eine Silverlight-Anwendung, die eine vor Jahren erstellte Javascript-Anwendung ersetzt, in der ich mehrere Javascript-Schnittstellen habe, die dieselbe Silverlight-Methode [ScriptableMember] aufrufen.

Alle diese älteren JS-Schnittstellen müssen unterstützt werden, und es muss eine neue Schnittstelle für den Zugriff auf neue Funktionen vorhanden sein. Dadurch würde die Arbeit erheblich beschleunigt, wenn die JS-Schnittstelle automatisch eingerichtet und der Aufruf der richtigen Silverlight-Methode an diese delegiert wird.

Ich kann hier keine Postleitzahl eingeben, das ist also die Zusammenfassung.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage