Как мне этого добиться, не используя Compile (), а просто с нормальным отражением?
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();
}
Как видите, код в блоке if не использует компиляцию во время выполнения для получения значения. Моя цель состоит в том, чтобы код в блоке else не также использовал компиляцию во время выполнения.