使用Lambda表达式获取属性或类型名称

马修

当lambda表达式引用实际实例本身时,如何使以下方法起作用?

例如代替

x => x.Name

表达式是

x => x

因此,如果我有某个类“ Car”,我可以返回字符串“ Car”,而不是只能对其属性进行操作(例如Car.Colour)

方法:

public static string GetMemberName(Expression expression)
    {
        if (expression is LambdaExpression)
            expression = ((LambdaExpression)expression).Body;

        if (expression is MemberExpression)
        {
            var memberExpression = (MemberExpression)expression;
            if (memberExpression.Expression.NodeType ==
                ExpressionType.MemberAccess)
            {
                return GetMemberName(memberExpression.Expression)
                       + "."
                       + memberExpression.Member.Name;
            }
            return memberExpression.Member.Name;
        }


        if (expression is UnaryExpression)
        {
            var unaryExpression = (UnaryExpression)expression;

            if (unaryExpression.NodeType != ExpressionType.Convert)
                throw new Exception(string.Format(
                    "Cannot interpret member from {0}",
                    expression));
            return GetMemberName(unaryExpression.Operand);
        }
        throw new Exception(string.Format(
            "Could not determine member from {0}",
            expression));
    }

即我想要类似的东西:

if (expression is SomeExpressionThatReturnsAnInstance)
{
    return (name of type of instance);
}
马修

我将其追溯到表达式的构造。它实际上不包含任何实例信息,也没有获取类型名称的方法。

static Expression<Func<object, object>> thisObject = x => x;

因此,无法从甚至没有类型(对象除外)的表达式派生类型名称。

用于生成返回属性名称的表达式的方法:

LambdaExpression BuildExpression(Type rootType, string propertyName)
    {
        try
        {
            var properties = propertyName.Split('.');
            ParameterExpression arg = Expression.Parameter(rootType, "x");
            Expression expr = arg;
            foreach (string property in properties)
            {
                PropertyInfo propertyInfo = rootType.GetProperty(property);
                if (propertyInfo == null)
                    return null;
                expr = Expression.Property(expr, propertyInfo);
                rootType = propertyInfo.PropertyType;
            }
            return Expression.Lambda(expr, arg);
        }
        catch (System.Exception ex)
        {
            return null;
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取类型名称或表达式的类型

来自分类Dev

获取 lambda 表达式的返回类型

来自分类Dev

如何从表达式获取属性名称

来自分类Dev

如何从表达式获取属性名称

来自分类Dev

通过Lambda表达式获取属性

来自分类Dev

获取用于表达式的通用类型的属性类型

来自分类Dev

获取通过lambda表达式传递的方法名称?

来自分类Dev

Kotlin - 从 lambda 表达式中获取名称

来自分类Dev

如何使用和ExpressionTree访问Lambda表达式中的属性名称

来自分类Dev

使用不带Lambda表达式的LinQ在List类型属性上定义条件

来自分类Dev

获取通过lambda表达式传递的嵌套属性的值

来自分类Dev

使用LAMBDA表达式获取具有相同类型的对象的对象树的深度

来自分类Dev

使用LAMBDA表达式获取具有相同类型的对象的对象树的深度

来自分类Dev

使用表达式,静态方法和基础对象获取类的属性名称

来自分类Dev

在java lambda表达式中获取不同返回类型的表达式

来自分类Dev

使用lambda表达式获取第一项属性

来自分类Dev

期望的方法名称-使用lambda表达式错误?

来自分类Dev

如何使用Lambda表达式更新属性?

来自分类Dev

使用Lambda表达式对多个属性进行排序

来自分类Dev

如何使用 Linq 创建多属性 lambda 表达式

来自分类Dev

如何使用 Select 连接属性表达式和 lambda?

来自分类Dev

使用decltype获取表达式的类型,而不使用const

来自分类Dev

从Lambda表达式获取propertyinfo,但使用int失败

来自分类Dev

使用 lambda 表达式从 Task 中获取价值

来自分类Dev

使用正则表达式获取 SNMP 陷阱类型

来自分类Dev

使用表达式获取属性的Get Acessor

来自分类Dev

属性获取器中使用的表达式内部递归

来自分类Dev

Lambda表达式的类型推断限制

来自分类Dev

用lambda表达式注册类型

Related 相关文章

  1. 1

    获取类型名称或表达式的类型

  2. 2

    获取 lambda 表达式的返回类型

  3. 3

    如何从表达式获取属性名称

  4. 4

    如何从表达式获取属性名称

  5. 5

    通过Lambda表达式获取属性

  6. 6

    获取用于表达式的通用类型的属性类型

  7. 7

    获取通过lambda表达式传递的方法名称?

  8. 8

    Kotlin - 从 lambda 表达式中获取名称

  9. 9

    如何使用和ExpressionTree访问Lambda表达式中的属性名称

  10. 10

    使用不带Lambda表达式的LinQ在List类型属性上定义条件

  11. 11

    获取通过lambda表达式传递的嵌套属性的值

  12. 12

    使用LAMBDA表达式获取具有相同类型的对象的对象树的深度

  13. 13

    使用LAMBDA表达式获取具有相同类型的对象的对象树的深度

  14. 14

    使用表达式,静态方法和基础对象获取类的属性名称

  15. 15

    在java lambda表达式中获取不同返回类型的表达式

  16. 16

    使用lambda表达式获取第一项属性

  17. 17

    期望的方法名称-使用lambda表达式错误?

  18. 18

    如何使用Lambda表达式更新属性?

  19. 19

    使用Lambda表达式对多个属性进行排序

  20. 20

    如何使用 Linq 创建多属性 lambda 表达式

  21. 21

    如何使用 Select 连接属性表达式和 lambda?

  22. 22

    使用decltype获取表达式的类型,而不使用const

  23. 23

    从Lambda表达式获取propertyinfo,但使用int失败

  24. 24

    使用 lambda 表达式从 Task 中获取价值

  25. 25

    使用正则表达式获取 SNMP 陷阱类型

  26. 26

    使用表达式获取属性的Get Acessor

  27. 27

    属性获取器中使用的表达式内部递归

  28. 28

    Lambda表达式的类型推断限制

  29. 29

    用lambda表达式注册类型

热门标签

归档