从 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?我盲目地复制了这段代码并将其保留原样,但这种情况似乎永远不会正确。

从 lambda 表达式获取路径

    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;
            }
        }
    }