从 lambda 表达式获取路径
本文关键字:路径 获取 表达式 lambda | 更新日期: 2023-09-27 18:33:44
我有这样的代码:
string PropertyName<T>(Expression<Func<T>> expression)
{
var body = expression.Body as MemberExpression;
if (body == null)
{
body = ((UnaryExpression)expression.Body).Operand as MemberExpression;
}
return body.Member.Name;
}
我以这种方式使用它:
Console.WriteLine(PropertyName(() => this.Property));
在屏幕上打印Property
现在我想这样改变它:
Console.WriteLine(PropertyName(() => this.OtherObject.Property));
会给我OtherObject.Property
,而不仅仅是Property
.这可能吗?
目的是从代码创建与依赖项属性的绑定,而无需对属性名称进行硬编码。
我还有一个问题,在线5
body
什么时候等于null
?我盲目地复制了这段代码并将其保留原样,但这种情况似乎永远不会正确。
string PropertyName<T>(Expression<Func<T>> expression)
{
var body = expression.Body as MemberExpression;
if (body == null)
{
body = ((UnaryExpression)expression.Body).Operand as MemberExpression;
}
return string.Join(".", GetPropertyNames(body).Reverse());
}
private IEnumerable<string> GetPropertyNames(MemberExpression body)
{
while (body != null)
{
yield return body.Member.Name;
var inner = body.Expression;
switch (inner.NodeType)
{
case ExpressionType.MemberAccess:
body = inner as MemberExpression;
break;
default:
body = null;
break;
}
}
}