Ce que j'essaie de faire semble simple, mais je ne trouve pas de solution. Supposons que j'ai une méthode avec cette signature:Func <> affecter une valeur au résultat
public void Foo<T,K>(Expression<Func<T,K>> binding, T item, K value)
Ce que je veux faire dans ma méthode: application du Func au point, obtenir la propriété de type K à laquelle les points d'expression de liaison, et attribuer " valeur "pour cela.
Si l'expression de liaison est quelque chose comme:
c => c.Property
Où « c » est « T » et « la propriété » est « K », je peux utiliser une réflexion facilement et définir la valeur à l'aide FieldInfo. Le code suivant fonctionne:
(((binding as LambdaExpression).Body as MemberExpression).Member as FieldInfo).SetValue(item, value);
Mais l'expression pourrait être quelque chose comme ceci:
c => c.SubClass.Property
ou
c => c.SubClass1.SubClass2.SubClassN.Property
Dans ce cas, le code de réflexion ne fonctionne pas, comme « la propriété "n'appartient pas directement à T, mais c'est toujours une expression lambda valide pour la signature de la méthode.
Je sais que si je compile le Func et l'exécute sur mon élément de type TI, j'obtiens la propriété, mais c'est comme une "copie" de celui-ci, et non une référence, donc même si j'affecte la valeur à Dans ce cas, la propriété de l'élément d'origine ne change pas.
Si quelqu'un a une solution propre à cela, ou si vous me signalez quelque chose qui peut me permettre une meilleure connaissance des arbres d'expression, vous êtes le bienvenu.
Votre 'copie' hypothèse est valable que s'il y a un 'struct' quelque part dans cette 'chaîne'. Pour les types de référence, l'affectation sera bonne. – leppie
Je m'attendais à beaucoup, mais je l'ai essayé et ne fonctionne pas. "SubClass" sont tous des "classes" donc types de référence, ainsi que T. Même la propriété finale dans ce que j'essayais de faire était une classe, donc un type de référence. –