C#!有条件的属性?

C#有没有 Conditional!ConditionalNotConditionalConditional(!) )属性?


我知道C#有一个Conditional属性 :

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

相当于1

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

但在这种情况下,我想反向行为(你必须明确select ):

 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 不是真的,但是确实如此。 不要让我带回Nitpicker的angular落。

首先,具有Conditional属性等同于#if而不是方法。 考虑:

 ShowDebugString(MethodThatTakesAges()); 

通过ConditionalAttribute的实际行为, MethodThatTakesAges不会被调用 – 包括参数评估的整个调用将从编译器中移除。

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

但是不,我不相信这里有什么是你想要的。 我刚刚检查了C#规范第17.4.2节,它涉及条件方法和条件属性类,没有任何内容暗示有这样的机制。

不。

相反,你可以写

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

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

诚然,我们不能'不'条件属性,但我们可以'不'条件如下所示。

 // 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"); } 

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

只要加上我的2美分,三年下来:-) …我使用[Conditional("DEBUG")]方法设置IsDebugMode属性来检查相反。 哈克,但它的作品:

 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); } 
 #ifndef ShowDebugString #define RemoveSDS #endif 

编辑:更多的澄清。 如果定义了Conditional["ShowDebugString"]则会调用Conditional["ShowDebugString"] 。 如果ShowDebugString未定义,则将调用Conditional["RemoveSDS"]

NET框架标准库注释的引用没有任何状态。 所以恐怕你必须自己推出!