Взгляд в дерево лямбда / выражений - PullRequest
1 голос
/ 24 августа 2010

Учитывая любую из приведенных ниже переменных, как я могу «проверить» их, чтобы получить переданное значение параметра?то есть 12345.

System.Func<DateTime> f1 = () => DateTime.Now.AddDays(12345);

System.Linq.Expressions.Expression<System.Func<DateTime>> 
                      f2 = () => DateTime.Now.AddDays(12345);

Редактировать:

Два ответа Микаэля и Кирка ниже оба отвечают на мой оригинальный вопрос.Тем не менее, теперь я сделал это немного сложнее, чтобы иметь дело с «реальной жизнью».В идеале я ищу «общее» решение, которое будет работать с чем-то вроде следующего:

var days = 123;
var hours = 456;
System.Func<DateTime> f1 = () => DateTime.Now.AddDays(days).AddHours(hours);
Expression<System.Func<DateTime>> f2 = () => DateTime.Now.AddDays(days).AddHours(hours);

Что мне действительно нужно, так это способ генерирования уникального «ключа», заданноголямда-выражение.Моя идея состоит в том, чтобы использовать имя метода и пары имя / значение параметра, но я приветствую другие предложения!Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

В дополнение к ответу Кирка Волля, если вы хотите, чтобы 12345 был объектом, вы можете использовать следующее:

    public void Run()
    {
        System.Linq.Expressions.Expression<System.Func<DateTime>> f2 = () => DateTime.Now.AddDays(12345);

        MethodCallExpression call = (MethodCallExpression)f2.Body;
        ConstantExpression arg = (ConstantExpression)call.Arguments[0];

        var value = GetValue(arg);
        Debug.WriteLine(value);
    }

    private object GetValue(ConstantExpression expression)
    {
        Expression conversion = Expression.Convert(expression, typeof(object));
        var getterLambda = Expression.Lambda<Func<object>>(conversion);

        var getter = getterLambda.Compile();

        return getter();
    }
2 голосов
/ 24 августа 2010

Если вы имеете в виду значение 12345, эти данные доступны только в f2 . Для f2:

MethodCallExpression call = (MethodCallExpression)f2.Body;
ConstantExpression arg = (ConstantExpression)call.Arguments[0];
Console.WriteLine(arg.Value);
1 голос
/ 24 августа 2010

Единственный способ получить его из f1 - это:

int days = (f1() - DateTime.Now).Days;

, в чем я сомневаюсь, это то, что вы хотите.и не так сложно, если тело функции так же четко определено, как ваш пример.Это запустится примерно так: ((f2 as LambdaExpression).Body as MethodCallExpression)....

Мне может потребоваться много времени, чтобы выяснить точный процесс, но вам, вероятно, будет проще просто проверить f2 в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...