我一直在与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"
。后者不起作用。
有没有办法处理这些嵌套实例,子项作为选择器的一部分?
答案 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;
}