C#!有条件的属性?
C#有没有 Conditional
( !Conditional
, NotConditional
, Conditional(!)
)属性?
我知道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框架标准库注释的引用没有任何状态。 所以恐怕你必须自己推出!