如何在不使用 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 block 中的代码没有使用运行时编译来获取值。我的目标是 else block 中的代码也不使用运行时编译。
最佳答案
你不能。反射是用于元数据和非常有限的字节码检查的工具。它不允许突变或代码生成。从根本上说,您在这里要实现的是元数据和 IL 生成行为。反射不适用于这种情况。
关于c# - 反射与编译以获得 MemberExpression 的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1527363/