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

Nib*_*Pig 2 c# expression

Expression我一整天都在使用s ,我的代码c => c.Name一般来说终于可以工作了。用户可以指定一个属性,例如"Name"作为字符串,我使用它:

var selectorParameter = Expression.Parameter(typeof(T), "c");
var selector = Expression.PropertyOrField(selectorParameter, memberName);
Run Code Online (Sandbox Code Playgroud)

为拿到它,为实现它。

然而我刚刚发现,在某些情况下,我不仅需要做c.Name一些类似c.Address.AddressLine1where memberName is 的事情"Address.AddressLine1"。后者不起作用。

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

Evk*_*Evk 6

你可以自己分解它,像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)