Можно ли использовать условный атрибут для создания схожего отладчика и метода времени выполнения?

Можно ли создать 2 метода, которые имеют одинаковое имя метода, передаются в значениях и возвращаются с использованием условного атрибута и, например, некоторого антиусловия

[Conditional("Debug")]
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());
        guidString = guidString.Replace("=", "");
        guidString = guidString.Replace("+", "");
        return guidString;
    }


    [!Conditional("Debug")]// I know using '!' doesn't really work
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());

        return guidString;
    } 

чтобы вы могли просто вызвать метод и в зависимости от того, определен ли "Debug", компилятор выберет какой метод?

Спасибо

3 ответа

Решение

Вы можете попробовать использовать #if DEBUG синтаксис вроде так:

#if DEBUG
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());
        guidString = guidString.Replace("=", "");
        guidString = guidString.Replace("+", "");
        return guidString;
    }

#else
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());

        return guidString;
    }
#endif 

Тем не менее, есть некоторые различия с использованием этого. Смотрите этот вопрос для более подробной информации.

Нет, это невозможно. Conditional Атрибут не контролирует, определен ли метод в коде, он просто контролирует условия, при которых вызов метода включается в код вызова.

Дополнительно это возможно для Conditional атрибут, который будет применяться несколько раз к методу. Следовательно, нет просто on / off решение будет принято здесь. Рассматривать

[Conditional("DEBUG")]
[Conditional("TRACE")]
void Target() { ... }

Здесь нужно рассмотреть 4 комбинации, а не только 2.

Вы не можете иметь несколько функций / методов с одним и тем же именем и одной и той же подписью. Однако вы можете перегрузить метод, изменив его сигнатуру. Например:

Private Function myMethod() As String
    Return "D"
End Function
Private Function myMethod(ByVal myString As String) As String
    Return "D"
End Function

Вместо того, чтобы пытаться создать одну и ту же точную функцию, которая выполняет две разные вещи, может быть лучше передать переменную и, в зависимости от значения, сделать две разные вещи.

Private Function myFunction(ByVal test As String) As String
     if(test.toUpper()= "QA") then
        'do one thing
     elseif(test.toUpper() = "LOCAL"
        'do another
     else
         'must be Prod
     end if
end Sub

Обычно в моем файле web.config есть ключ, который обозначает, какую среду я использую (Local, QA, Prod), и в зависимости от этого значения я передаю другой параметр в свою функцию / метод. Затем, когда я публикую, я изменяю ключ веб-конфигурации

Другие вопросы по тегам