2011-03-25 8 views
10

¿Cómo puedo obtener los valores de argumentos de un MethodCallExpression?Obteniendo valores de argumento de MethodCallExpression

Hoy lo hago de esta manera, pero NO ES lo suficientemente rápido:

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

Este método de obtener valores de una expresión, pero si sé que la expresión siempre vienen de un MethodCallExpression.Arguments puedo optimizarlo?

creo que puedo cambiar primera línea con esto, pero no sé si el trabajo para todas las situaciones:

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

Quieres decir algo como "objeto [] args = methodCallExpression.Arguments.Select (p => p.Value);"? –

+0

@Rodrigo Eso es lo que estoy buscando, pero Value no es una propiedad de Expression. – Langdon

Respuesta

3

Cake

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

Pastel? (y luego un texto de relleno para que se publique el comentario de 5 letras) – joce

+0

Pedazo de pastel :) –

+4

¿Por qué asumes que los argumentos siempre serán constantes? –

2

me gustaría probar esto a devolver el objeto:

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

Es mucho más rápido que llamar a lo siguiente:

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

¿Por qué votar abajo? – TheMiddleMan

Cuestiones relacionadas