0

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

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()方法是我的扩展方法。

基本上,这个表达式树按顺序由 a LambdaExpression、两个MemberExpressions 和 a组成ConstantExpression

tuple.Item2当我尝试memberExpression.Member.Name从最后一个MemberExpression. 这给了我“元组”而不是“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我在这里做错了什么? 我失踪的确切情况是什么?

先感谢您

4

1 回答 1

1

实际上,这棵树是 a LambdaExpression,它的BodyaPropertyExpression具有a为“Item2”的Member字段,而 a是用于获取 的值的a 。请注意,and是继承自 的内部类型。NameExpressionFieldExpressiontuplePropertyExpressionFieldExpressionMemberExpression

所以你需要得到(Body as MemberExpression).Member.Name而不是Body.Expression.Member.Name.

将树视为MemberExpression(从 : 中获取Member:Item2 (从Expression: [周围类] 中MemberExpression获取Member:tuple Expression))。

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

于 2017-09-08T23:14:10.443 回答