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 사실은 아니지만 충분히 사실입니다. 내가 Nitpicker 's Corner를 다시 가져 오게하지 마십시오.
첫째, Conditional
속성 을 갖는 것은 메소드 내부에있는 것과 동일 하지 않습니다#if
. 중히 여기다:
ShowDebugString(MethodThatTakesAges());
의 실제 행동으로 ConditionalAttribute
, MethodThatTakesAges
전체 호출 - 호출되지 않습니다 인수 평가를 포함하여이 컴파일러에서 제거됩니다.
물론 다른 점은 메서드가 아닌 호출자 의 컴파일 타임에 컴파일 타임 전 처리기 기호에 의존한다는 것 입니다. :)
하지만 아니, 당신이 여기서 원하는 것을 할 수있는 것은 없다고 생각합니다. 조건부 메서드와 조건부 속성 클래스를 다루는 C # 사양 섹션을 방금 확인했는데 거기에 그러한 메커니즘이 있음을 암시하는 내용이 없습니다.
아니.
대신 다음과 같이 작성할 수 있습니다.
#if !ShowDebugString
[Conditional("FALSE")]
#endif
와 달리 [Conditional]
호출자의 어셈블리가 아니라 어셈블리에있는 기호의 존재 여부에 따라 결정됩니다.
사실 우리는 ConditionalAttribute를 'NOT'할 수 없지만 아래에 제시된 조건을 '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");
}
이것이 문제를 해결하는 데 도움이되기를 바랍니다.)
내 2 센트 만 더하면 3 년이 지나면 :-) ... 나는 반대를 확인 [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
?
편집 : 자세한 설명을 위해. ShowDebugString이 정의 Conditional["ShowDebugString"]
되면 호출됩니다. ShowDebugString이 정의되지 않은 경우 Conditional["RemoveSDS"]
호출됩니다.
NET 프레임 워크 표준 라이브러리 주석 참조는 어떤을 명시하지 않습니다. 그래서 나는 당신이 직접 굴려야 할 것이 두렵습니다!
참고 URL : https://stackoverflow.com/questions/8230191/c-sharp-conditional-attribute
'program tip' 카테고리의 다른 글
각도 리소스에 의해 2d로 구문 분석되는 1 차원 문자열 배열 (0) | 2020.11.28 |
---|---|
POST를 사용하는 Javascript window.open 패스 값 (0) | 2020.11.27 |
원격 RDP에서 로컬 컴퓨터로 파일 복사 (0) | 2020.11.27 |
WebClient 요청에 대한 User-Agent 헤더 설정 (0) | 2020.11.27 |
파이썬에서 globals ()에 대한 이유? (0) | 2020.11.27 |