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 аннотированная ссылка не любой. Так что, боюсь, вам придется свернуть свой собственный!