实现绑定路径

时间:2014-11-19 13:28:43

标签: c# reflection expression expression-trees func

尝试实现字段绑定系统,我有以下方法:

    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]的引用。关于如何做到这一点的任何想法?

2 个答案:

答案 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);        
    }