2015-01-06 11 views
5

So che sto chiedendo il bizzarro ma solo per i calci, è possibile ottenere il MethodInfo per un'espressione lambda?Ottieni MethodInfo per un'espressione lambda

io sono alla ricerca di qualcosa di simile:

(Func<int, string>(i => i.ToString())).MethodInfo

UPDATE voglio ottenere informazioni metodo indipendentemente dal fatto che il corpo della Lamda è un'espressione chiamata del metodo o no, vale a dire a prescindere che tipo di espressione è il corpo del lambda.

Quindi, ad es.

Questo potrebbe funzionare.

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => Program.GetNewDog(i); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), ((MethodCallExpression)(conversionExpression.Body)).Method); 

class Program 
{ 
    static Dog GetNewDog(int i) 
    { 
    return new Dog(); 
    } 
} 

Ma voglio anche questo al lavoro:

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => new Dog(); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), /*...???... */); 
+0

Un'espressione non ha informazioni sul metodo. Se lo compili, puoi ottenere le informazioni sul metodo dal delegato. – leppie

+0

Non mi interessa creare un'espressione. Ho aggiunto l'aggiornamento in risposta alla risposta di Timothy Shields qui sotto. Tutto quello che voglio è un metodoInfo da un delegato. Possibile? –

+1

Funziona bene '(nuovo Func (i => i.ToString())). Metodo' – leppie

risposta

6

Tu sei abbastanza vicino :)

si può fare qualcosa di simile:

MethodInfo meth = (new Func<int, string>(i => i.ToString())).Method; 

Nota: Questo potrebbe avere problemi se si dispone di più 'abbonati' a un'istanza delegato .

MSDN: http://msdn2.microsoft.com/en-us/library/system.delegate.method

+0

Ma come potrebbero esserci più abbonati a un metodo anonimo oa un lambda? Come faresti a farvi riferimento in qualsiasi posto diverso da dove è stato dichiarato? –

+0

Dovresti prima dichiarare il delegato e poi usare '+ =' per aggiungere ulteriori sottoscrittori. Sono d'accordo, con i delegati anonimi, questo scenario è molto improbabile. Puoi comunque controllarlo, oppure 'Method' potrebbe essere nullo in quel caso. Si noti inoltre che il delegato potrebbe disporre di un contesto se la proprietà 'Target' non è nulla. – leppie

+0

Ah, ora capisco cosa intendi. Stai dicendo che "Func " ha già altri metodi nella sua lista di invocazioni, quindi fai attenzione, giusto? –

2

utilizzando lo spazio System.Linq.Expressions, è possibile effettuare le seguenti operazioni.

Expression<Func<int, string>> expression = i => i.ToString(); 
MethodInfo method = ((MethodCallExpression)expression.Body).Method; 
+0

Interessante mod. Grazie. :-) –

+0

No, aspetta. Questo funzionerà solo per questo particolare esempio. Colpa mia. Avrei dovuto chiarire. Voglio che funzioni indipendentemente da ciò che contiene il corpo della lambda. Questa soluzione presuppone che il corpo di lambda sia un'espressione di chiamata di metodo, che è colpa mia, perché ho dato un esempio del genere. –

Problemi correlati