【问题标题】:Implementing Binding Paths实现绑定路径
【发布时间】:2014-11-19 13:28:42
【问题描述】:

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

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

【问题讨论】:

  • 您在此处查看的是MethodCallExpression。如果我没记错的话,该方法的签名是get_Item(int index)

标签: c# reflection expression expression-trees func


【解决方案1】:

一般的方法是创建一个表达式,将值分配给您的表达式:

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()();
}

【讨论】:

    【解决方案2】:

    找到了一个目前可行的解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 2018-04-05
      • 2018-08-17
      • 2012-11-11
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2020-02-12
      相关资源
      最近更新 更多