2013-07-30 17 views
5

Sto cercando un metodo per convertire l'istanza di MemberInfo in "Func" (per usarlo tramite espressione lambda in seguito).Reflection MemberInfo to Func <T1, T2>

Consente, dire che ho una funzione di membro di tipo

public bool func(int); 

utilizzando la riflessione, in qualche modo ottengo istanza di MemberInfo "mi", ora voglio convertirlo in Func<int, bool>; tipo. qualcosa come:

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

C'è un modo per farlo?

ps. La risposta di Marc Grawell risolve il mio problema, senza bisogno di ulteriori commenti

+0

Func è una funzione * su un'istanza specifica *, mentre MemberInfo non è legata a un'istanza. Hai l'istanza disponibile nel tuo codice? – Heinzi

+0

Su quale target vorresti chiamarlo? E sai che * sempre * restituirà un 'bool' e prenderà un' int'? Praticamente guarda 'Delegate.CreateDelegate' ... –

+0

Potresti voler controllare la tua premessa; "usarlo con espressione lambda più tardi" - ottenere un delegato non ti aiuterà con un'espressione lambda –

risposta

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

notare che target è l'oggetto che si desidera utilizzare, in quanto func è un metodo non-static. Se era un metodo static, puoi ometterlo (o passare null). In alternativa, è possibile omettere target (o passare null) se lo si fa Func<Foo, int, bool> dove Foo è il tipo che dichiara func.

Tuttavia !!! Si noti che avere un numero Func<int,bool> non ha praticamente alcun senso in termini di creazione di un'espressione lambda; espressioni lambda usano raramente delegati.

+0

Per curiosità, sai se c'è qualche differenza tra il 'Delegate.CreateDelegate' che usi e il' MethodInfo.CreateDelegate 'che ho inserito la mia risposta? – hvd

+0

Puoi chiarire cosa intendi con la tua ultima affermazione, _ "Tuttavia ... le espressioni lambda usano raramente i delegati." _? – stakx

+0

@hvd prima di .NET 4.5, una differenza molto grande: 'MethodInfo.CreateDelegate' non esiste –

Problemi correlati