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.