C#:从 lambda 表达式获取链中的属性名称

标签 c# lambda

我正在开发一个使用 lambda 表达式指定属性的 API。我正在使用这段与这段代码相似的著名代码(这是经过简化和不完整的,只是为了弄清楚我在说什么):

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

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

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

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


有一个somehow similar looking question ,但我认为他们正试图在那里组合 lambda 表达式。

Another question也在处理嵌套的属性名称,但我真的不明白他们在说什么。

最佳答案

是这样的吗?

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 表达式获取链中的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667408/

相关文章:

linq - 在 Entity Framework Where 子句中使用枚举

python - 在 pandas 数据帧的字典行中创建元素计数的新列

c# - .Net 中 LINQ 和 Lambda 表达式的效率和性能如何?

c# - Azure SDK UnauthorizedException : Put token failed. 状态代码 : 401, 状态描述:未经授权:当 KeyName 为空时,资源 URI 必须

c# - 使用 iTextSharp 打开另存为窗口

c# - 将数据从 Microsoft SQL Server 数据库发送到 JavaScript 函数的最佳方式

c# - 嵌套数组的 Lambda

c# - Windows Phone 8.1 (WinRT) : Custom Looping Selector

c# - 两个应用程序之间的声音交互

C++ 不可复制的 lambda 行为可复制?