c# - 反射与编译以获得 MemberExpression 的值(value)

标签 c# reflection lambda

如何在不使用 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/

相关文章:

c# - UWP - MediaPlayerElement 与 MediaElement

go - 哈希反射类型

lambda - lambda 乘法如何工作?

c# - 为什么我不应该使用反射实现 Equals 和 GetHashCode?

C# 反射和属性 : Bug? 我无法解决这个问题

python - 将每列中的值分配为该列的总和

java - 创建的 Runnables 的 lambda 的不同行为

C# Linq "Entity with the same key ' 0' already added."插入多行时

c# - 用于排序或筛选表实体的 Azure 定价

c# - 字符 + 字符 = 整数?为什么?