2010-05-20 4 views
1

J'ai une méthode Get sur un type MyType1 acceptant un Func<MyType2, bool> comme paramètre.Examen d'une expression lambda à l'exécution en C#

Un exemple de son utilisation:

mytype1Instance.Get(x => x.Guid == guid)); 

Je voudrais créer une implémentation de bout de la méthode Get qui examine l'expression lambda entrant et détermine la valeur de guid est. Clairement le lambda pourrait être "n'importe quoi", mais je suis heureux que le talon fasse une supposition au sujet du lambda, qu'il essaie de faire correspondre sur la propriété Guid.

Comment est-ce que je peux faire ceci? Je suppose qu'il implique l'utilisation du type Expression intégré?

+0

voir aussi http://stackoverflow.com/questions/2228845/is-it-possible-with-moq-to-stub-method-calls-with-lambda-parameters – Ben

Répondre

2

Jetez un oeil à Typed Reflector, qui est un composant simple fichier source unique qui fournit un pont d'un accès membre fortement typé à correspondant MemberInfo instances.

Même si vous ne pouvez pas l'utiliser comme, cela devrait vous donner une bonne idée de ce que vous pouvez faire avec Expressions.

+0

Merci, semble utile. Actuellement aux prises avec la conversion du Func en Expression pour l'analyse. – Ben

+2

@Ben: Je ne pense pas que vous devez toujours initialiser l'expression lambda à une expression immédiatement. La conversion d'un Func (code IL compilé) en une expression serait essentiellement une décompilation, ce qui est difficile et ne sera probablement pas supporté. Rappelez-vous que les expressions lambda elles-mêmes ne sont pas Func ou tout autre type de délégué. Ce n'est que lorsque vous les attribuez à une variable ou que vous les transmettez à une méthode pour qu'elle acquière sa signification spécifique. D'où la réponse de Leppie. – Joren

+0

Convertir un Func , f, en une Expression, e: 'Expression > e = x => f (x);' – Ben

2
public void Get<T>(Expression<Func<T,bool>> expr) 
{ 
    // look at expr 
}