我正在开发一个使用 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"
和 "Length"
)。有没有办法通过合理的努力做到这一点?
有一个somehow similar looking question ,但我认为他们正试图在那里组合 lambda 表达式。
Another question也在处理嵌套的属性名称,但我真的不明白他们在说什么。
最佳答案
是这样的吗?
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;
}
}
关于C#:从 lambda 表达式获取链中的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667408/