Does C# have a not Conditional (!Conditional, NotConditional, Conditional(!)) attribute?
i know C# has a Conditional attribute:
[Conditional("ShowDebugString")]
public static void ShowDebugString(string s)
{
...
}
which is equivalent1 to:
public static void ShowDebugString(string s)
{
#if ShowDebugString
...
#endif
}
But in this case i want the inverse behavior (you have to specifically opt out):
public static void ShowDebugString(string s)
{
#if !RemoveSDS
...
#endif
}
Which leads me to try:
[!Conditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
...
}
which doesn't compile. And:
[Conditional("!RemoveSDS")]
public static void ShowDebugString(string s)
{
...
}
which doesn't compile. And:
[NotConditional("RemoveSDS")]
public static void ShowDebugString(string s)
{
...
}
which doesn't compile because it's only wishful thinking.
1Not true, but true enough. Don't make me bring back the Nitpicker's Corner.
First, having the Conditional attribute is not equivalent to having #if instead the method. Consider:
ShowDebugString(MethodThatTakesAges());
With the real behaviour of ConditionalAttribute, MethodThatTakesAges doesn't get called - the entire call including argument evaluation is removed from the compiler.
Of course the other point is that it depends on the compile-time preprocessor symbols at the compile time of the caller, not of the method :)
But no, I don't believe there's anything which does what you want here. I've just checked the C# spec section 17.4.2 which deals with conditional methods and conditional attribute classes, and there's nothing in there suggesting there's any such mechanism.
Nope.
Instead, you can write
#if !ShowDebugString
[Conditional("FALSE")]
#endif
Note that unlike [Conditional], this will be determined by the presence of the symbol in your assembly, not in your caller's assembly.
True we can't 'NOT' ConditionalAttribute, but we can 'NOT' the condition as presented below.
// 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");
}
hope this helps you solve your problem ;)
Just adding my 2 cents, three years down the line :-) ... I use a [Conditional("DEBUG")] method to set an IsDebugMode property to check the reverse. Hacky, but it works:
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
?
edit: For more clarification. If ShowDebugString is defined Conditional["ShowDebugString"] will be called. If ShowDebugString is not defined, Conditional["RemoveSDS"] will be called.
The NET framework standard library annotated reference doesn't state any. So I'm afraid you'll have to roll your own!
来源:https://stackoverflow.com/questions/8230191/c-sharp-conditional-attribute