如何让Expression.PropertyOrField为孩子工作?

时间:2017-04-12 13:51:58

标签: c# expression

我一直在与Expression一起工作,而我的代码通常以c => c.Name为例终于奏效了。用户可以指定一个属性,例如"Name"作为字符串,我使用它:

var selectorParameter = Expression.Parameter(typeof(T), "c");
var selector = Expression.PropertyOrField(selectorParameter, memberName);

得到它。

但是我刚刚发现,在某些情况下,我不仅需要c.Name,还需要c.Address.AddressLine1,其中memberName是"Address.AddressLine1"。后者不起作用。

有没有办法处理这些嵌套实例,子项作为选择器的一部分?

1 个答案:

答案 0 :(得分:2)

你可以自己分解它,如下:

var selectorParameter = Expression.Parameter(typeof(T), "c");
MemberExpression selector = null;
// first part goes to parameter - "x.Parameter"
Expression current = selectorParameter;
foreach (var part in memberName.Split('.')) {
    selector = Expression.PropertyOrField(current, part);
    // subsequent parts go to selector itself: "x.Parameter.AnotherParameter"
    current = selector;
}

如果你想确保所有这些属性确实存在,你可以这样做:

var selectorParameter = Expression.Parameter(typeof(T), "c");
MemberExpression selector = null;
Expression current = selectorParameter;
Type currentType = typeof(T);
foreach (var part in memberName.Split('.')) {
    var prop = currentType.GetProperty(part, BindingFlags.Instance | BindingFlags.Public);
    if (prop == null) {
        // do something
    }
    selector = Expression.Property(current, prop);
    current = selector;
    currentType = prop.PropertyType;
}