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"。后者不起作用。
有没有办法处理这些嵌套实例,并将子实例作为选择器的一部分?
你可以自己分解它,像这样:
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)
| 归档时间: |
|
| 查看次数: |
2196 次 |
| 最近记录: |