[c#]Lambda 表达式获取的路径

标签: Linq Lambda C#
发布时间: 2017/2/28 21:30:43
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有这样的代码︰

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 。这是甚至有可能吗?

目的是创建绑定到依赖项属性从代码没有硬编码的属性名称。

我也有一个问题时是否 body 线上 5 等于 null 吗?我盲目地复制此代码,正是在它的假,但这种情况似乎永远不会成真。

解决方法 1:

    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;

            }
        }
    }
官方微信
官方QQ群
31647020