Buduje delegata z MethodInfo?

Po gogli i lądowaniu na SO i przeczytaniuto inne pytanie

Czy możliwe jest zbudowanie poprawnego Delegata z MethodInfoJeśli nie znałeś liczby ani typów parametrów w czasie kompilacji?

Więcej na ten temat: czy można to zrobić elegancko bez użycia Reflection.

Jest to dla mnie pewien problem, ponieważ Delegate.CreateDelegate wymaga ode mnie podania poprawnego typu Delegata jako pierwszego parametru, w przeciwnym razie wyrzuci wyjątki lub wywoła niepoprawną metodę.

Buduję kilka narzędzi ninja i to by bardzo pomogło ... Dzięki!

Oto ogólne rozwiązanie:

/// <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;
}

Uwaga: Buduję aplikację Silverlight, która zastąpiłaby wbudowaną wcześniej aplikację javascript, w której mam wiele interfejsów JavaScript, które wywołują tę samą metodę Silverlight [ScriptableMember].

Wszystkie te starsze interfejsy JS muszą być obsługiwane, a także nowy interfejs dostępu do nowych funkcji, więc coś, co automatycznie konfiguruje interfejs JS i „deleguje” wywołanie do właściwej metody Silverlight, znacznie przyspieszy pracę.

Nie mogę tutaj pisać kodu, więc to jest podsumowanie.

questionAnswers(3)

yourAnswerToTheQuestion