[英]Getting path from lambda expression
I have code like this: 我有这样的代码:
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;
}
I use it in this fashion: 我以这种方式使用它:
Console.WriteLine(PropertyName(() => this.Property));
which prints Property
on screen 在屏幕上打印
Property
Now I would like to change it so: 现在,我想更改它:
Console.WriteLine(PropertyName(() => this.OtherObject.Property));
would give me OtherObject.Property
instead of just Property
. 会给我
OtherObject.Property
而不是Property
。 Is this even possible? 这有可能吗?
The purpose is to create bindings to dependency properties from code without hard coding of property names. 目的是通过代码创建对依赖属性的绑定,而无需对属性名称进行硬编码。
I also have a question when does the body
on line 5
equals to null
? 我也有一个问题,第
5
行的body
何时等于null
? I copied this code mindlessly and leave it at it was but this condition appears to never be true. 我不经意地复制了此代码,并保持原样,但这种情况似乎永远都不成立。
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;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.