Как я могу достичь этого без использования Compile(), но только с нормальным отражением?Отражение против компиляции, чтобы получить значение MemberExpression
var value = Expression.Lambda(memberExpression).Compile().DynamicInvoke();
Я хочу, чтобы иметь возможность работать на IPhone (MonoTouch), которая не допускает динамическую компиляцию.
ОБНОВЛЕНИЕ: вот более контекст. Это код, я работаю над:
if (expression.Expression is ConstantExpression)
{
var constantExpression = (ConstantExpression)expression.Expression;
var fieldInfo = constantExpression.Value.GetType().GetField(expression.Member.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (fieldInfo != null)
{
return fieldInfo.GetValue(constantExpression.Value);
}
{
var propertyInfo = constantExpression.Value.GetType().GetProperty(expression.Member.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (propertyInfo != null)
{
return propertyInfo.GetValue(constantExpression.Value, null);
}
}
}
else
{
return Expression.Lambda(expression.Expression).Compile().DynamicInvoke();
}
Как вы можете видеть, код в блоке, если не использует во время выполнения компиляции для получения значения. Моя цель состоит в том, что код в блоке else не используется.
Что вы говорите не совсем правильно. Я знаю, например, что в случае, когда выражение memberExpression.Expression является константным выражением, вы можете получить его значение, отразившись на свойстве Value значения константы. Моя проблема в том, что, когда это не ConstantExpression, я не могу понять, как получить дескриптор экземпляра, который содержит значение. –
Если это не константа, вам нужно выполнить ее, чтобы получить результат. Таким образом, компиляция. – Gregory