Создает делегата из MethodInfo?
После поиска в Google и посадки на SO и прочитавэтот другой вопрос
Is it possible to build a correct Delegate from a MethodInfo if you didn't know the number or types of parameters at compile time?
Подробнее об этом: можно ли сделать это элегантно без использования Reflection.Emit или компоновщиков типов?
Для меня это как бы облом, потому что Delegate.CreateDelegate требует, чтобы я указывал правильный тип Делегата в качестве первого параметра, иначе он будет генерировать исключения или вызывать неправильный метод.
Я строю несколько снастей для ниндзя, и это очень поможет ... Спасибо!
Here's a generic solution:
/// <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;
}
NoteЯ создаю приложение Silverlight, которое заменит встроенное приложение javascript много лет назад, в котором у меня есть несколько интерфейсов Javascript, которые вызывают один и тот же метод Silverlight [ScriptableMember].
Необходимо поддерживать все эти устаревшие JS-интерфейсы, а также новый интерфейс для доступа к новым функциям, что автоматически настраивает JS-интерфейс и «делегирует». вызов правильного метода Silverlight поможет значительно ускорить работу.
Я не могу разместить здесь код, так что это краткое изложение.