Получение значений параметра 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 Ответ.