Получение значений аргумента MethodCallExpression - PullRequest
12 голосов
/ 25 марта 2011

Как я могу получить значения аргументов MethodCallExpression?

Сегодня я делаю так, но не достаточно быстро:

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

Этот метод получает значения из Expression,но если я знаю, что выражение всегда происходит из MethodCallExpression. Аргументы, я могу его оптимизировать?

Я думаю, что могу изменить первую строку на это, но я не знаю, работает ли для всех ситуаций:

LambdaExpression l = Expression.Lambda(element);

Ответы [ 3 ]

3 голосов
/ 20 мая 2011

Торт

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 голосов
/ 23 мая 2018

Это сработало для меня:

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

Он сочетает в себе оригинальное решение ОП с Ответом Спящего Смита .

2 голосов
/ 18 февраля 2015

Я бы попробовал это вернуть объект:

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