Получение значений параметра MethodCallExpression
Как я могу получить значения аргументов MethodCallExpression?
Сегодня я делаю так, но не достаточно быстро:
private static object GetArgumentValue(Expression element)
{
LambdaExpression l = Expression.Lambda(Expression.Convert(element, element.Type));
return l.Compile().DynamicInvoke();
}
Этот метод получает значения из Expression, но если я знаю, что Expression всегда приходит из MethodCallExpression.Arguments, я могу его оптимизировать?
Я думаю, что я могу изменить первую строку на это, но я не знаю, если работать для всех ситуаций:
LambdaExpression l = Expression.Lambda(element);
Ответы
Ответ 1
Торт
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();
}
}
Ответ 2
Я бы попробовал это, чтобы вернуть объект:
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();
Ответ 3
Это сработало для меня:
private static object GetArgumentValue(Expression element)
{
if (element is ConstantExpression)
{
return (element as ConstantExpression).Value;
}
var l = Expression.Lambda(Expression.Convert(element, element.Type));
return l.Compile().DynamicInvoke();
}
Он сочетает в себе оригинальное решение OP и Sleeper Smith Ответ.