3
이 일 ...어떻게 깊은 특성 다음 코드를 감안할 때
class Program {
static void Main(string[] args) {
Foo foo = new Foo { Bar = new Bar { Description= "Martin" }, Name = "Martin" };
DoLambdaStuff(foo, f => f.Name);
DoLambdaStuff(foo, f => f.Bar.Description);
}
static void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {
// Set up and test "getter"...
Func<TObject, TValue> getValue = expression.Compile();
TValue stuff = getValue(obj);
// Set up and test "setter"...
ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TObject)), valueParameterExpression = Expression.Parameter(typeof(TValue));
Expression<Action<TObject, TValue>> setValueExpression = Expression.Lambda<Action<TObject, TValue>>(
Expression.Block(
Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)expression.Body).Member.Name), valueParameterExpression)
), objectParameterExpression, valueParameterExpression
);
Action<TObject, TValue> setValue = setValueExpression.Compile();
setValue(obj, stuff);
}
}
class Foo {
public Bar Bar { get; set; }
public string Name { get; set; }
}
class Bar {
public string Description{ get; set; }
}
나는 얕은 속성에 액세스하고 있기 때문에 DoLambdaStuff(foo, f => f.Name)
에 대한 호출이 작품을 좋아하지만 DoLambdaStuff(foo, f => f.Bar.Description)
에 대한 호출이 실패 할 수 있습니다 getValue
기능이 잘 작동의 나는 개체의 깊은 속성에 액세스하려고 시도하고 때문에 setValueExpression
의 작성은 실패합니다.
아무도 내가 깊은 특성뿐만 아니라 얕은에 대한 setValueExpression
을 만들 수 있도록 내가이를 수정하는 데 도움시겠습니까?
감사합니다.
감사합니다. 이것은 정확히 내가 찾고 있었던 것 같습니다. –