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.