获取MethodCallExpression的参数值

问题描述:

如何获取MethodCallExpression的参数值?获取MethodCallExpression的参数值

今天我做到这一点的方式,但isn't速度不够快:

private static object GetArgumentValue(Expression element) 
{ 
    LambdaExpression l = Expression.Lambda(Expression.Convert(element, element.Type)); 
    return l.Compile().DynamicInvoke(); 
} 

这种方法从表达得值,但如果我知道,表达总是来自MethodCallExpression.Arguments我可以优化呢?

我想我可以改变第一线,这一点,但我不知道是否适用于所有情况:

LambdaExpression l = Expression.Lambda(element); 
+0

你的意思是像“object [] args = methodCallExpression.Arguments.Select(p => p.Value);”? – 2011-03-25 14:04:20

+0

@Rodrigo这就是我要找的,但价值不是表达式的属性。 – Langdon 2011-04-12 20:46:34

蛋糕

class Program 
    { 
     static void Main(string[] args) 
     { 
      Expression<Action<string>> action = a => Console.WriteLine("asdf"); 
      var mce = action.Body as MethodCallExpression; 
      Console.WriteLine((mce.Arguments[0] as ConstantExpression).Value); 
      Console.ReadKey(); 
     } 
    } 
+0

蛋糕? (然后一些填充文本,所以5个字母的评论可以张贴) – joce 2011-05-20 04:51:46

+0

一块蛋糕:) – 2011-05-20 05:31:36

+4

为什么你认为参数将永远是常量? – 2011-05-20 11:40:59

我会尝试这个返回对象:

private static object _getValue(MethodCallExpression expression) 
{ 
    var objectMember = Expression.Convert(expression, typeof(object)); 

    var getterLambda = Expression.Lambda<Func<object>>(objectMember); 

    var getter = getterLambda.Compile(); 

    return getter(); 
} 

然后调用以下函数要快得多:

LambdaExpression l = Expression.Lambda(Expression.Convert(element, element.Type)); 
return l.Compile().DynamicInvoke(); 
+0

为什么投票? – TheMiddleMan 2015-11-13 14:21:54