После поиска и посадки на SO и прочтения этого другого вопроса
Возможно ли построить правильный делегат из MethodInfo, если вы не знали количество или типы параметров во время компиляции?
Подробнее об этом: можно ли это сделать элегантно без использования Reflection.Emit или типа строителей?
Это сортировка для меня, потому что Delegate.CreateDelegate требует, чтобы я указал правильный тип делегирования в качестве первого параметра, иначе он будет генерировать исключения или вызывать неправильный метод.
Я строю несколько передач ниндзя, и это очень поможет... Спасибо!
Вот общее решение:
/// <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;
}
Примечание. Я создаю приложение Silverlight, которое заменило бы встроенное javascript-приложение, встроенное в предыдущее время, в котором у меня есть несколько интерфейсов Javascript, которые вызывают один и тот же метод Silverlight [ScriptableMember].
Все поддерживаемые интерфейсы JS должны поддерживаться, а также новый интерфейс для доступа к новым функциям, поэтому что-то, что автоматически настраивает интерфейс JS и "делегирует" вызов правильному методу Silverlight, поможет значительно ускорить работу.
Я не могу отправить код здесь, так что резюме.