Регистрация лямбда-выражений - PullRequest
8 голосов
/ 29 марта 2012
public class Demo
{       
    public void When(Func<Person, bool> condition)
    {
        if (!condition)
        {
            Log.Info("Condition not met.");
            return;
        }

        // Do something
    }
}

В методе When я хотел бы регистрировать, когда предикат или Func<bool> возвращает false. Тем не менее, просто регистрация "условие не выполнено" не дает мне много информации. Если я вызову метод так:

demo.When(x => x.Name == "John");

Есть ли способ преобразовать это выражение в читаемую / значимую строку для целей ведения журнала?

1 Ответ

12 голосов
/ 29 марта 2012

В обычной лямбде мало полезных метаданных. Вы могли бы использовать вместо этого деревья выражений:

void When(Expression<Func<Person, bool>> condition)
{
    var person = new Person();
    if (!condition.Compile()(person))
    {
        Console.WriteLine("Condition not met: " + condition);
        return;
    }
}

Тогда на сайте звонка:

 When(x => false);

И вывод будет:

Условие не выполнено: x => False

Однако деревья выражений вносят гораздо больше накладных расходов, и condition.Compile тоже не из дешевых. Поэтому я не могу рекомендовать этот подход, но он будет выводить полезную информацию, как вы хотите.

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