如何在 x => x.property 中获取 ContstantExpression 的名称和值

How to get the name and value of ContstantExpression in x => x.property

我正在创建一种在 C# 中获取表达式的 NameValue 的简单方法。但是,我发现了一个我无法弄清楚的案例。请看下面的代码:

public void GetValue_Object_TIn_Property_Test()
{
    string val = "value";
    var tuple = Tuple.Create(new object(), val);
    Expression<Func<object, string>> expression = x => tuple.Item2;

    Assert.AreEqual(val, expression.GetValue());
}

.GetValue()方法是我的扩展方法。

基本上这个表达式树由一个 LambdaExpression、两个 MemberExpression 和一个 ConstantExpression 依次组成。

当我尝试获取 tuple.Item2 的名称时,我从最后一个 MemberExpression 中获取 memberExpression.Member.Name。这给了我 "tuple" 而不是 "Item2"。 我怎样才能得到 "Item2"?

此外,当我尝试获取表达式的值时,我得到了整个元组而不是 Item2。我正在使用以下方法获取值:

public override bool TryGetValue(
    MemberExpression memberExpression,
    out T value
) {
    value = default(T);
    bool success = false;

    var fieldInfo = memberExpression.Member as FieldInfo;
    if (success = (fieldInfo != null))
    {
        var valueObj = fieldInfo.GetValue(expression.Value);
        if (success = (valueObj is T || valueObj == null))
        {
            value = (T)valueObj;
        }
    }

    return success;
}

其中 MemberExpression 又是最后一个 MemberExpression我在这里做错了什么? 我遗漏的具体情况是什么?

提前致谢

实际上,树是一个 LambdaExpression,其 Body 是一个 PropertyExpression,它有一个 Member 字段,Name 为 "Item2" 和一个 ExpressionFieldExpression 用于获取 tuple 的值。请注意 PropertyExpressionFieldExpression 是从 MemberExpression.

继承的内部类型

因此您需要获取 (Body as MemberExpression).Member.Name 而不是 Body.Expression.Member.Name

将树视为 MemberExpression(get Member:Item2 from Expression:MemberExpression(get Member:tuple from Expression:[周围class])).

你用过LINQPad吗?它的 Dump() 命令可以向您展示这个以及更多。