Могу ли я получить строковое представление условия, переданного как функция bool в функцию? - PullRequest
1 голос
/ 30 апреля 2011

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

В принципе, я хочу иметь такой метод:

void Validate(bool validation)
{
    if (!validation)
    {
        throw new Exception();
    }
}

А потом я хочу назвать это как:

try
{
    Validate(1 > 2);
}
catch (Exception e)
{
    // This is where I would output the error to the user
}

Я хочу получить часть 1 > 2 в виде строки, не определяя ее как единицу в другом месте, не вычисляя строку до bool, не используя предикаты или внешние методы. В идеале это было бы сделано через отражение. Я также приму предложения о лучшем способе сделать то, что я хочу сделать. Предположим, что bool может быть любым: 1 > 2, "cheese" != "ham", objectA == objectB и т. Д.

Ответы [ 2 ]

5 голосов
/ 30 апреля 2011

Вы не можете.Что ж, возможно, вы можете это сделать (в Python можно взломать что-то подобное вместе, я полагаю, хотя это не было бы красиво, не работало бы надежно и требовало бы наличия исходного кода под рукой), но обычно:

  • У вас нет строковых представлений кода во время выполнения.
  • Аргументы (выражения) оцениваются до вызова функции.
  • Оценка не дает ничего, кромеодинокий бул, который не помнит ни малейшего о том, откуда он взялся.

Прежде чем искать какой-нибудь мерзкий противный взлом, чтобы подражать этому, проверьте, не проще ли добавить строкулитерал во время компиляции.

1 голос
/ 30 апреля 2011

Самое близкое, что вы сможете получить, - это использовать лямбда-выражения, которые выглядят следующим образом:

void Validate(Expression<Func<bool>> validation)
{
    if (!Lambda.Compile(validation)())
    {
        string message = "..." //parse lambda expression here.
        //see: http://msdn.microsoft.com/en-us/library/bb397951.aspx

        throw new Exception(message);
    }
}


try
{
   Validate(() => 1 > 2);
}
catch (Exception e)
{
    Console.Write(e.Message)// This is where I would output the error to the user
}

Хотя, если честно, я не уверен, что это стоит того, и вы не захотите использовать его в тесном цикле из-за динамической компиляции лямбда-выражения (хотя вы можете кешировать результат компиляция при необходимости)

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