То, что я пытаюсь сделать, кажется простым, но я не могу найти способ. Предположим, у меня есть метод с такой подписью:
public void Foo<T,K>(Expression<Func<T,K>> binding, T item, K value)
В моем методе я хочу сделать следующее: применить Func к элементу, получить свойство типа K, на которое указывает выражение привязки, и присвоить ему «значение».
Если выражение привязки выглядит примерно так:
c => c.Property
Где "c" - это "T", а "Property" - это "K", я могу легко использовать некоторое отражение и установить значение с помощью FieldInfo. Работает следующий код:
(((binding as LambdaExpression).Body as MemberExpression).Member as FieldInfo).SetValue(item, value);
Но выражение может быть примерно таким:
c => c.SubClass.Property
или
c => c.SubClass1.SubClass2.SubClassN.Property
В этом случае код отражения не работает, так как «Свойство» не принадлежит непосредственно T, но это все еще допустимое лямбда-выражение для сигнатуры метода.
Я знаю, что если я скомпилирую Func и выполню его на своем элементе типа TI, получу свойство, но оно будет похоже на его «копию», а не на ссылку, поэтому даже если я присваиваю ему значение свойство исходного элемента не изменяется.
Если у кого-то есть чистое решение для этого или просто укажите мне на что-то, что может дать мне лучшее знание Деревьев Выражений, очень приветствуем.