C#:从 lambda 表达式获取链中属性的名称 [英] C#: Getting Names of properties in a chain from lambda expression

查看:21
本文介绍了C#:从 lambda 表达式获取链中属性的名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个使用 lambda 表达式来指定属性的 API.我正在使用这段与此相似的著名代码(这是简化且不完整的,只是为了说明我在说什么):

I'm developing a API that uses lambda expressions to specify properties. I'm using this famous piece of code similar to this one (this is simplified and incomplete, just to make clear what I'm talking about):

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

现在我想通过链接属性名称来指定属性路径,如下所示:

Now I would like to specify a property path by chaining property names, like this:

Foo((MyClass x) => x.Name.Length);

Foo 应该能够将路径拆分为其属性名称("Name""Length").有没有办法以合理的努力做到这一点?

Foo should be able to split the path into its property names ("Name" and "Length"). Is there a way to do this with reasonable effort?

有一个看起来有些相似的问题,但我认为它们是尝试在那里组合 lambda 表达式.

There is a somehow similar looking question, but I think they are trying to combine lambda expressions there.

另一个问题 也在处理嵌套的属性名称,但我真的不明白他们在说什么.

Another question also is dealing with nested property names, but I don't really understand what they are talking about.

推荐答案

类似的事情?

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 表达式获取链中属性的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆