Reflection against compilation to get the value of a MemberExpression expression

How can I achieve this without using compilation (), but only with normal reflection?

var value = Expression.Lambda(memberExpression).Compile().DynamicInvoke(); 

I want this to be able to run on an IPhone (MonoTouch), which does not allow dynamic compilation.

UPDATE: There is more context. This is the code I'm working on:

 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(); } 

As you can see, the code in the if block does not use compilation at run time to get the value. My goal is that the code in the else block also does not use compilation at runtime.

+4
source share
2 answers

You can not. Reflection is a tool for metadata and very limited control of byte code. It does not allow mutations or code generation. Basically, what you are trying to achieve here is metadata and the act of generating IL. Reflection will not work for this scenario.

+4
source

I have a few more specific cases:

  private static object ExtractValue(Expression expression) { if (expression == null) { return null; } var ce = expression as ConstantExpression; if (ce != null) { return ce.Value; } var ma = expression as MemberExpression; if (ma != null) { var se = ma.Expression; object val = null; if (se != null) { val = ExtractValue(se); } var fi = ma.Member as FieldInfo; if (fi != null) { return fi.GetValue(val); } else { var pi = ma.Member as PropertyInfo; if (pi != null) { return pi.GetValue(val); } } } var mce = expression as MethodCallExpression; if (mce != null) { return mce.Method.Invoke(ExtractValue(mce.Object), mce.Arguments.Select(ExtractValue).ToArray()); } var le = expression as LambdaExpression; if (le != null) { if (le.Parameters.Count == 0) { return ExtractValue(le.Body); } else { return le.Compile().DynamicInvoke(); } } var dynamicInvoke = Expression.Lambda(expression).Compile().DynamicInvoke(); return dynamicInvoke; } 

Maybe there is a library with more complex expressions (creating new objects, etc.).

0
source

All Articles