我正在开发一个使用 lambda 表达式来指定属性的 API。我正在使用这段与此类似的著名代码(这是简化且不完整的,只是为了弄清楚我在说什么):
public void Foo<T, P>(Expression<Func<T, P>> action)
{
var expression = (MemberExpression)action.Body;
string propertyName = expression.Member.Name;
// ...
}
像这样调用:
Foo((String x) => x.Length);
现在我想通过链接属性名称来指定属性路径,如下所示:
Foo((MyClass x) => x.Name.Length);
Foo 应该能够将路径拆分为其属性名称("Name"
and "Length"
)。有没有办法通过合理的努力来做到这一点?
有一个某种程度上看起来相似的问题 https://stackoverflow.com/questions/995142/combining-lambda-expressions-to-property-paths,但我认为他们正在尝试在那里组合 lambda 表达式。
另一个问题 https://stackoverflow.com/questions/536932/how-to-create-expression-tree-lambda-for-a-deep-property-from-a-string也正在处理嵌套属性名称,但我不太明白他们在说什么。
像这样的东西吗?
public void Foo<T, P>(Expression<Func<T, P>> expr)
{
MemberExpression me;
switch (expr.Body.NodeType)
{
case ExpressionType.Convert:
case ExpressionType.ConvertChecked:
var ue = expr.Body as UnaryExpression;
me = ((ue != null) ? ue.Operand : null) as MemberExpression;
break;
default:
me = expr.Body as MemberExpression;
break;
}
while (me != null)
{
string propertyName = me.Member.Name;
Type propertyType = me.Type;
Console.WriteLine(propertyName + ": " + propertyType);
me = me.Expression as MemberExpression;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)