Construye un delegado de MethodInfo?

Después de googlear y aterrizar en SO y haber leídoesta otra pregunta

¿Es posible construir un delegado correcto a partir de un MethodInfo?Si ¿No sabías el número o los tipos de parámetros en tiempo de compilación?

Más sobre esto: ¿se puede hacer de manera elegante sin el uso de Reflection.Emit o tipo de constructores?

Esto es algo así para mí porque Delegate.CreateDelegate requiere que especifique el tipo de Delegado correcto como primer parámetro o de lo contrario lanzaría excepciones o invocaría un método incorrecto.

Estoy construyendo algunos engranajes ninja y esto ayudaría mucho ... ¡Gracias!

Aquí hay una solución genérica:

/// <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;
}

Nota: Estoy creando una aplicación Silverlight que reemplazaría a una aplicación javascript construida hace años en la que tengo múltiples interfaces de Javascript que llaman al mismo método Silverlight [ScriptableMember].

Todas esas interfaces JS heredadas deben ser compatibles, así como una nueva interfaz para acceder a nuevas funciones, por lo que algo que configura automáticamente la interfaz JS y que "delegue" la llamada al método de Silverlight correcto ayudaría a acelerar el trabajo.

No puedo publicar código aquí, así que ese es el resumen.

Respuestas a la pregunta(3)

Su respuesta a la pregunta