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
}
но в этом случае я хочу, чтобы инверсия поведение (вы должны конкретно отказаться):
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не правда, но правда. Не заставляй меня возвращать угол придурка.
6 ответов
во-первых, имея метод. Подумайте:
ShowDebugString(MethodThatTakesAges());
С реальным поведением ConditionalAttribute
, MethodThatTakesAges
не вызывается-весь вызов включая оценку аргумент удаляется из компилятора.
конечно, другой момент заключается в том, что он зависит от символов препроцессора времени компиляции во время компиляции абонента, а не метод :)
но нет, я не верю, что есть что-то, что делает то, что вы хотите здесь. Я только что проверил раздел спецификации C# 17.4.2, который касается условных методов и условных классов атрибутов, и там нет ничего, что предполагало бы наличие такого механизма.
Неа.
вместо этого вы можете написать
#if !ShowDebugString
[Conditional("FALSE")]
#endif
обратите внимание, что в отличие от [Conditional]
, это будет определяться наличием символа в вашей сборке, а не в сборке вызывающего абонента.
True мы не можем " не "ConditionalAttribute, но мы не можем" не " условие, как показано ниже.
// 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
свойство для проверки обратного. 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);
}
#ifndef ShowDebugString
#define RemoveSDS
#endif
?
edit: для получения дополнительных разъяснений. Если showdebugstring определен Conditional["ShowDebugString"]
будет называться. Если ShowDebugString не определен,Conditional["RemoveSDS"]
будет называться.
на стандартная библиотека NET framework аннотированная ссылка не любой. Так что, боюсь, вам придется свернуть свой собственный!