2013-05-10 2 views
1

Как создать делегат с типами, известными только во время выполнения?Создать делегат с типами, известными во время выполнения

Я хотел бы сделать следующее:

Type type1 = someObject.getType(); 
Type type2 = someOtherObject.getType(); 

var getter = (Func<type1, type2>)Delegate.CreateDelegate(
    typeof(Func<,>).MakeGenericType(type1, type2), someMethodInfo); 

Как я могу достичь чего-то подобного?

+1

Вы не можете. 'Func ' не известно во время компиляции. – leppie

+0

Ваша переменная 'getter' должна иметь тип _compile-time_, который известен во время компиляции. Это может быть 'System.Delegate'. –

ответ

5

Я подозреваю, что вы хотите Expression.GetFuncType как более простой способ сделать вашу операцию typeof(...).MakeGenericType.

var delegateType = Expression.GetFuncType(type1, type2); 
Delegate getter = Delegate.CreateDelegate(delegateType, someMethodInfo); 

Вы не можете иметь время компиляции типа для getter, который более специфичен, чем Delegateхотя 1, потому что вы просто не знаете, что тип во время компиляции. Вы могли бы потенциально использовать dynamic хотя, что бы сделать его проще для вызова делегата:

dynamic getter = ...; 
var result = getter(input); 

Как было отмечено в комментариях, вы могли приведение к MulticastDelegate, но это не будет на самом деле купить вы что-нибудь.

+1

+1: сикофанная выдержка от меня, не читая вопроса и не отвечая. Выполняя свой долг! (шутка) – x0n

+0

'MulticastDelegate' более конкретно; p – leppie

+0

@leppie: True. Будет редактировать. –

2

Вы можете создать универсальный метод для этого:

public Func<T1, T2> GetFunc<T1, T2>(T1 Object1, T2 Object2, MethodInfo Method) 
{ 
    return (Func<T1, T2>)Delegate.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(T1), typeof(T2)), Method); 
} 

И я уверен, что вы можете сделать что-то, используя ту же самую философию с методом, чтобы избежать всего этого отражения вещей.

Обс: это будет работать только в том случае, если T1 и T2 являются типизированными переменными. Если они as object, вы получите Func<object, object>. Но .... если объекты, которые вы дадите методу, тоже as object, это не будет проблемой. И, может быть, вы всегда можете использовать Func<object, object>, в зависимости от вашего сценария.

Смежные вопросы