Как получить значение свойства из 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()