Cria um representante do MethodInfo?

Depois de googling e pouso em SO e depois de leresta outra questão

É possível criar um delegado correto de um MethodInfoE se você não sabia o número ou os tipos de parâmetros em tempo de compilação?

Mais sobre isso: isso pode ser feito elegantemente sem o uso de Reflection.Emit ou digite construtores?

Isso é meio chato para mim porque Delegate.CreateDelegate requer que eu especifique o tipo Delegate correto como o primeiro parâmetro, ou então ele lançaria exceções ou invocaria um método incorreto.

Eu estou construindo algumas engrenagens ninja e isso ajudaria muito ... Obrigado!

Aqui está uma solução 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: Estou construindo um aplicativo do Silverlight que substituiria um aplicativo javascript criado há anos, no qual tenho várias interfaces de Javascript que chamam o mesmo método do Silverlight [ScriptableMember].

Todas essas interfaces JS herdadas precisam ser suportadas, bem como uma nova interface para acessar novos recursos, portanto, algo que configura automaticamente a interface JS e "delega" a chamada ao método Silverlight correto ajudará a acelerar muito o trabalho.

Não posso postar código aqui, então esse é o resumo.

questionAnswers(3)

yourAnswerToTheQuestion