После прибегая к помощи и посадки на SO и прочтя this other questionСоздает делегата из MethodInfo?
Можно ли построить правильный делегат из 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-интерфейсы, которые вызывают один и тот же метод Silverlight [ScriptableMember].
Необходимо поддерживать все эти унаследованные JS-интерфейсы, а также новый интерфейс для доступа к новым функциям, поэтому что-то, что автоматически настраивает интерфейс JS и «делегирует» вызов правильному методу Silverlight, поможет значительно ускорить работу.
Я не могу отправить здесь код, так что это резюме.
Я создаю это, чтобы склеить Silverlight [ScriptableMember] и отдельный интерфейс Javascript, поэтому мне не нужно беспокоиться о синхронизации сигнатур методов в обоих местоположениях. – chakrit
Ничего себе .... это помогло! Вы, ребята, рок! – chakrit
@ Marc Gravell, я не могу вызвать делегата, созданного в приведенном выше коде, например d(). После googling я обнаружил, что dynamicInvoke может использоваться для вызова метода, который очень медленный. PLS помощи. Я новичок в делегатах и мероприятиях. мое требование заключается в том, чтобы динамически вызывать метод, число или тип параметров будут известны только во время выполнения. – Saranya