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.