C#!条件属性?

时间:2011-11-22 16:31:29

标签: c# conditional conditional-compilation

C#是否有 Conditional!ConditionalNotConditionalConditional(!))属性?


我知道C#有Conditional attribute

[Conditional("ShowDebugString")]
public static void ShowDebugString(string s)
{
   ...
}

等同于 1

public static void ShowDebugString(string s)
{
#if ShowDebugString
   ...
#endif
}

但是在这种情况下,我想要行为(你必须专门选择退出):

public static void ShowDebugString(string s)
{
#if !RemoveSDS
   ...
#endif
}

这让我尝试:

[!Conditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

不编译。和

[Conditional("!RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

不编译。和

[NotConditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
   ...
}

不能编译,因为它只是一厢情愿。

1 Not true, but true enough. Don't make me bring back the Nitpicker's Corner.

6 个答案:

答案 0 :(得分:53)

首先,让Conditional属性等同于使用#if代替方法。考虑:

ShowDebugString(MethodThatTakesAges());

对于ConditionalAttribute的真实行为,MethodThatTakesAges未被调用 - 整个调用包括参数评估将从编译器中删除。

当然另一点是它依赖于调用者编译时的编译时预处理器符号,而不是方法:)

但不,我不相信在这里有什么能做你想要的。我刚刚查看了C#规范部分17.4.2,该部分处理条件方法和条件属性类,并且没有任何内容表明存在任何此类机制。

答案 1 :(得分:41)

不。

相反,你可以写

#if !ShowDebugString
[Conditional("FALSE")]
#endif

请注意,与[Conditional]不同,这将取决于程序集中符号的存在,而不是调用者程序集中的符号。

答案 2 :(得分:17)

确实,我们不能' NOT' ConditionalAttribute,但我们不能' NOT'条件如下。

// at the begining of the code before uses
#if DUMMY
#undef NOT_DUMMY
#else
#define NOT_DUMMY
#endif

// somewhere in class
[Conditional("NOT_DUMMY")]
public static void ShowDebugStringNOTDUMMY(string s)
{
  Debug.Print("ShowDebugStringNOTDUMMY");
}


[Conditional("DUMMY")]
public static void ShowDebugStringDUMMY(string s)
{
  Debug.Print("ShowDebugStringDUMMY");
}

希望这可以帮助您解决问题;)

答案 3 :(得分:12)

只需添加我的2美分,三年下线:-) ...我使用[Conditional("DEBUG")]方法设置IsDebugMode属性来检查相反的情况。 Hacky,但它确实有效:

private bool _isDebugMode = false;
public bool IsDebugMode
{
    get
    {
        CheckDebugMode();
        return _isDebugMode;
    }
}

[Conditional("DEBUG")]
private void CheckDebugMode()
{
    _isDebugMode = true;
}

private void DisplaySplashScreen()
{
    if (IsDebugMode) return;

    var splashScreenViewModel = new SplashScreenVM(500)
    {
        Header = "MyCompany Deals",
        Title = "Main Menu Test",
        LoadingMessage = "Creating Repositories...",
        VersionString = string.Format("v{0}.{1}.{2}",
            GlobalInfo.Version_Major, GlobalInfo.Version_Minor, GlobalInfo.Version_Build)
    };

    SplashScreenFactory.CreateSplashScreen(splashScreenViewModel);
}

答案 4 :(得分:0)

.NET框架标准库带注释的引用没有说明任何内容。所以我担心你不得不自己动手!

答案 5 :(得分:0)

我喜欢@Heliac提到的方法,并为此创建了一个辅助类:

class Build
{
    public static bool IsDebug { get; private set; }

    static Build()
    {
        CheckDebugMode();
    }

    [System.Diagnostics.Conditional("DEBUG")]
    static void CheckDebugMode()
    {
        IsDebug = true;
    }
}

尽管对DEBUG的用处不是很快

这可以让您做类似的事情

static readonly bool UseCaching = !Build.IsDebug;