2013-03-04 8 views
5

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

[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», компилятор выберет какой метод?

Thanks

+0

Пример реальной жизни [HtmlAgilityPack/IOLibrary.cs] (https://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/IOLibrary.cs), если кто-либо заинтересован. – Bakudan

ответ

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 

Однако, есть некоторые различия с помощью этого , См. this question для более подробной информации.

+0

«Отладка» в коде должна быть заглавной: '#if DEBUG' –

+0

@chuex - Справа! Забыл об этом. Благодарю. :) –

+0

Спасибо, я совсем забыл даже проверить, что –

3

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

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

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

Есть 4 комбинации здесь, чтобы рассмотреть, а не только 2.

1

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

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) и в зависимости от этого значения, я бы передать другой параметр в моя функция/метод. Затем, когда я публикую, я меняю ключ веб-конфигурации