2009-12-21 5 views
4

L'utilisation de l'expression lambda pour capturer la propriété ou la méthode d'une classe comme le code suivant présente de nombreux avantages.Comment capturer une propriété statique ou non statique en utilisant l'expression lambda?

void CaptureProperty<T, TProperty> (Func<T, TProperty> exp) 
{ 
    // some logic to keep exp variable 
} 

// So you can use below code to call above method. 
CaptureProperty<string, int>(x => x.Length); 

Toutefois, le code ci-dessus ne prend pas en charge la propriété statique. Alors, comment créer une méthode qui supporte à la fois la propriété statique et la propriété non statique?

Merci,

Répondre

7

Eh bien, vous pouvez capturer une propriété statique de cette façon:

CaptureProperty<string, Encoding>(x => Encoding.UTF8); 

Vous devez ensuite fournir une valeur "factice" au moment de l'exécution si ...

Une alternative serait de fournir une autre surcharge avec un seul argument de type:

void CaptureProperty<T>(Func<T> func) 
{ 
    // Whatever 
} 

utilisation est comme ceci:

CaptureProperty<Encoding>(() => Encoding.UTF8); 

Est-ce que vous êtes après?

Si vous vouliez unifier les deux à l'intérieur, vous pourriez avoir un type imbriqué privé « factice » dans le même type que CaptureProperty et mettre en œuvre la version statique comme ceci:

void CaptureProperty<T>(Func<T> func) 
{ 
    CaptureProperty<DummyType, T>(x => func()); 
} 

Ensuite, vous pouvez détecter que le Le type "source" est DummyType lorsque vous devez appeler la fonction plus tard. Cela peut ou peut ne pas être une idée utile en fonction de ce que vous faites :)

+0

Super! Expression de paramètre vide. –

+0

Je veux juste convertir la propriété capturée à quelque chose comme "{className}. {PropertyName}" pour l'envoi à JavaScript. –

+0

@Soul_Master: Dans ce cas, vous voulez 'Expression >' plutôt que 'Func '. –

Questions connexes