是否可以使用条件属性来创建similliar调试器和运行时方法?

时间:2013-03-04 16:59:42

标签: c# conditional-attribute

是否可以创建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 个答案:

答案 0 :(得分:3)

不,这是不可能的。 Conditional属性不控制是否在代码中定义方法,它只控制方法调用包含在调用代码中的条件。

此外,Conditional属性可以多次应用于方法。因此,这里没有简单的on / off决定。考虑

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

这里有4种组合需要考虑,而不仅仅是2.

答案 1 :(得分: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

答案 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),并且根据该值,我会将不同的参数传递给我的函数/方法。然后,当我发布时,我更改了Web配置密钥