c# - 使用 lambda 表达式获取属性或类型名称

标签 c# lambda expression-trees

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

最佳答案

我可能误解了,但是直接的 x => x 将是一个 ParameterExpression。只需在您现有的 is MemberExpression 测试下添加一个额外的测试:

if (expression is MemberExpression)
{
    // As-is
}
// New condition
if (expression is ParameterExpression)
{
    return expression.Type.Name;
}

使用这段代码:

class Car { public string Color { get; set; }}

Expression<Func<Car, string>> expr1 = x => x.Color;
Expression<Func<Car, Car>> expr2 = x => x;

Console.WriteLine(GetMemberName(expr1));
> Color
Console.WriteLine(GetMemberName(expr2));
> Car

关于c# - 使用 lambda 表达式获取属性或类型名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29788448/

相关文章:

c# - 具有动态参数的表达式树

c# - IE6 : window. onresize 在 IIS 上工作,在 asp.net 开发服务器上崩溃

c# - 为什么算术表达式没有针对 C# 中的 0 乘法进行优化

c# - 如何从 MVC 中的 DateTime 变量中删除时间部分

c# - 如何从 List<T> 中获取第 n 个项目?

kotlin - 匿名接口(interface)实例作为 Kotlin 中的接口(interface)属性

c# - C# 中的 byte[] 究竟是什么?

java - 解决类型推断时对Exception的约束

.net - 从一个重要的 IQueryable 编译 Linq 到 SQL 查询

c# - 如何用表达式树表达 All have Any