尝试实现字段绑定系统,我有以下方法:
public void SetValue<TField>(Expression<Func<TField>> field, object value)
{
((field.Body as MemberExpression).Member as FieldInfo).SetValue(this, value);
// check bindings etc.
}
就像这样使用:
myObj.SetValue(() => myObj.SomeStringField, "SomeString");
它按预期工作,设置了值,我可以做一些我想要的其他东西,比如检查绑定等。
现在我正在尝试实现绑定路径的支持,即允许类似的内容:
myObj.SetValue(() => myObj.Names[1].FirstName, "John");
我得到了FirstName的FieldInfo,但现在我还需要(至少)从表达式中获取对象myObj.Names [1]的引用。关于如何做到这一点的任何想法?
答案 0 :(得分:2)
一般方法是创建一个表达式,为表达式赋值:
public static void SetValue<TField>(Expression<Func<TField>> field, TField value)
{
var expression = Expression.Lambda<Action>(
Expression.Assign(field.Body, Expression.Constant(value)));
expression.Compile()();
}
答案 1 :(得分:0)
找到一个现在有效的解决方案。
public void SetValue<TField>(Expression<Func<TField>> field, object value)
{
MemberExpression memberExpression = field.Body as MemberExpression;
var objectMember = Expression.Convert(memberExpression.Expression, typeof(object));
var getterLambda = Expression.Lambda<Func<object>>(objectMember);
var getter = getterLambda.Compile();
var obj = getter();
(memberExpression.Member as FieldInfo).SetValue(obj, value);
}