2013-07-30 2 views
5

Я ищу способ преобразования экземпляра MemberInfo в тип «Func» (чтобы использовать его через выражение лямбда позже).Reflection MemberInfo to Func <T1, T2>

Давайте, скажем, у меня есть функция-член типа

public bool func(int); 

Используя отражение, я каким-то образом получить экземпляр MemberInfo «ми», теперь я хочу, чтобы преобразовать его в Func<int, bool>; типа. что-то вроде:

Func<int, bool f = myType.GetMember(mi.Name); 

Есть ли способ сделать это?

пс. Ответ Марка Grawell в решает мой вопрос, нет необходимости в дальнейшие комментариях

+0

Func - это функция * в конкретном экземпляре *, тогда как MemberInfo не привязана к экземпляру. У вас есть экземпляр, доступный в вашем коде? – Heinzi

+0

Какую цель вы бы хотели назвать? И знаете ли вы, что всегда будет возвращать 'bool' и принимать' int'? В основном посмотрите на 'Delegate.CreateDelegate' ... –

+0

Возможно, вы захотите проверить свое предположение; «использовать его через выражение лямбда позже» - получение делегата не поможет вам с выражением лямбда –

ответ

5
Func<int,bool> f = Delegate.CreateDelegate(
      typeof(Func<int,bool>), target, (MethodInfo)mi); 

Здесь следует отметить, что target является объектом вы хотите использовать, поскольку func является не- static метода. Если это был метод static, вы можете опустить это (или пройти null). Кроме того, вы можете опустить target (или пройти null), если вы сделаете это Func<Foo, int, bool>, где Foo - это тип, который объявляет func.

Однако !!! Обратите внимание, что наличие Func<int,bool> в значительной степени бессмысленно с точки зрения создания лямбда-выражения; лямбда-выражения редко используют делегатов.

+0

Из любопытства вы знаете, есть ли разница между используемым 'Delegate.CreateDelegate' и' MethodInfo.CreateDelegate 'что я вложил в свой ответ? – hvd

+0

Можете ли вы пояснить, что вы подразумеваете под последним утверждением, _ «Однако ... лямбда-выражения редко используют делегатов». _? – stakx

+0

@hvd до .NET 4.5, очень большая разница: 'MethodInfo.CreateDelegate' не существует –

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