Как получить значение свойства из MemberExpression без .Compile ()?

у меня возникают проблемы при попытке получить значение объекта из дерева выражений без использования .Compile ()

Объект довольно прост.

var userModel = new UserModel { Email = "[email protected]"};

Метод, который дает мне проблемы, выглядит следующим образом.

private void VisitMemberAccess(MemberExpression expression, MemberExpression left)
{
    var key = left != null ? left.Member.Name : expression.Member.Name;
    if (expression.Expression.NodeType.ToString() == "Parameter")
    {
        // add the string key
        _strings.Add(string.Format("[{0}]", key));
    }
    else
    {
        // add the string parameter
        _strings.Add(string.Format("@{0}", key));

        // Potential NullReferenceException
        var val = (expression.Member as FieldInfo).GetValue((expression.Expression as ConstantExpression).Value);

        // add parameter value
        Parameters.Add("@" + key, val);
    }
}

Тесты ям бег довольно прост

[Test]  // PASS
public void ShouldVisitExpressionByGuidObject ()
{
    // Setup
    var id = new Guid( "CCAF57D9-88A4-4DCD-87C7-DB875E0D4E66" );
    const string expectedString = "[Id] = @Id";
    var expectedParameters = new Dictionary { { "@Id", id } };

    // Execute
    var actualExpression = TestExpression( u => u.Id == id );
    var actualParameters = actualExpression.Parameters;
    var actualString = actualExpression.WhereExpression;

    // Test
    Assert.AreEqual( expectedString, actualString );
    CollectionAssert.AreEquivalent( expectedParameters, actualParameters );
}
[Test]  // FAIL [System.NullReferenceException : Object reference not set to an instance of an object.]
public void ShouldVisitExpressionByStringObject ()
{
    // Setup
    var expectedUser = new UserModel {Email = "[email protected]"};

    const string expectedString = "[Email] = @Email";
    var expectedParameters = new Dictionary { { "@Email", expectedUser.Email } };

    // Execute
    var actualExpression = TestExpression( u => u.Email == expectedUser.Email );
    var actualParameters = actualExpression.Parameters;
    var actualString = actualExpression.WhereExpression;

    // Assert
    Assert.AreEqual( expectedString, actualString );
    CollectionAssert.AreEquivalent( expectedParameters, actualParameters );
}

Я должен отметить, что изменение

var val = (expression.Member as FieldInfo).GetValue((expression.Expression as ConstantExpression).Value);

в

var val = Expression.Lambda( expression ).Compile().DynamicInvoke().ToString();

позволит пройти тест, однако этот код должен быть запущен на iOS, и поэтому может 'т использовать.Compile()

Ответы на вопрос(1)

Ваш ответ на вопрос