Выражение в строку - PullRequest
3 голосов
/ 22 марта 2011

Как мне получить строку типа

Namespace.IMyService.Do("1")

из выражения, приведенного ниже в этом фрагменте:

IMyService myService = ...;
int param1 = 1;

myExpressionService.Get(c => myService.Do(param1));

На самом деле я не хочу вызывать Do, если условие не выполняется с использованием сгенерированной строки.

Ответы [ 3 ]

4 голосов
/ 22 марта 2011

Вам придется пройти Expression trees.Вот пример кода:

internal static class myExpressionService
{
    public static string Get(Expression<Action> expression)
    {
        MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
        var method = methodCallExpression.Method;
        var argument = (ConstantExpression) methodCallExpression.Arguments.First();

        return string.Format("{0}.{1}({2})", method.DeclaringType.FullName, method.Name, argument.Value);
    }
}

Он работает, если вызывается следующим образом: string result = myExpressionService.Get(() => myService.Do(1));

Вывод: Namespace.IMyService.Do(1)

Вы можете расширить / обновитьэто для обработки вашего сценария.

1 голос
/ 22 марта 2011

Это также будет работать (хотя это не особенно элегантно):

public static string MethodCallExpressionRepresentation(this LambdaExpression expr)
{
    var expression = (MethodCallExpression)expr.Body;

    var arguments = string.Join(", ", expression.Arguments.OfType<MemberExpression>().Select(x => {
        var tempInstance = ((ConstantExpression)x.Expression).Value;
        var fieldInfo = (FieldInfo)x.Member;
        return "\"" + fieldInfo.GetValue(tempInstance).ToString() + "\"";
    }).ToArray());

    return expression.Object.Type.FullName + "." + expression.Method.Name + "(" + arguments + ")";
}

Вы можете назвать это так:

Expression<Action> expr = c => myService.Do(param1));
var repr = expr.MethodCallExpressionRepresentation();    // Namespace.IMyService.Do("1")
0 голосов
/ 22 марта 2011

Вы должны иметь возможность вызывать .ToString () для полученного выражения. Согласно документации MS ToString () возвращает текстовое представление выражения. Вы пробовали это?

...