Создает делегата из 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 поможет значительно ускорить работу.

Я не могу разместить здесь код, так что это краткое изложение.

Ответы на вопрос(3)

Ваш ответ на вопрос