Условная компиляция - постепенное прекращение использования части кода в C # - PullRequest
4 голосов
/ 05 февраля 2010

Я работаю над проектом, где мне нужно разработать набор классов для одного этапа проекта.

На следующем этапе нам не понадобится набор классов и методов. Эти наборы классов и методов будут использоваться во всем приложении, поэтому, если я добавлю их, как и любые другие классы, мне потребуется удалить их вручную, если они не требуются.

Есть ли способ в C #, чтобы я мог установить атрибут для класса или мест, где создается экземпляр класса, чтобы избежать этого создания и вызовов методов на основе значения атрибута.

Что-то вроде, настройка

[Phase = 2]
BridgingComponent bridgeComponent = new BridgeComponent();

Любая помощь приветствуется на этом фронте.

Ответы [ 5 ]

3 голосов
/ 05 февраля 2010

Когда компилятор C # встречает директиву # if , за которой следует директива #endif, он будет компилировать код между директивами, только если определенный символ определен.

#define FLAG_1
...
#if FLAG_1
    [Phase = 2]
    BridgingComponent bridgeComponent = new BridgeComponent();
#else
    [Phase = 2]
    BridgingComponent bridgeComponent;
#endif
2 голосов
/ 05 февраля 2010

Звучит так, будто вы просите #, если .

#if Phase2
BridgingComponent bridgeComponent = new BridgeComponent();
#endif

А затем используйте /define Phase2 в строке компиляции, когда вы хотите, чтобы BridgingComponent был включен в сборку, а не когда нет.

1 голос
/ 05 февраля 2010

О методах вы можете использовать атрибут Условный :

// Comment this line to exclude method with Conditional attribute
#define PHASE_1

using System;
using System.Diagnostics;
class Program {

    [Conditional("PHASE_1")]
    public static void DoSomething(string s) {
        Console.WriteLine(s);
    }

    public static void Main() {
        DoSomething("Hello World");
    }
}

Хорошо, что если символ не определен, вызовы методов не компилируются.

1 голос
/ 05 февраля 2010

Вы также можете использовать инфраструктуру внедрения зависимостей, такую ​​как Spring.NET, NInject и т. Д. Другой способ - использовать фабричные методы для создания экземпляров ваших классов. После этого у вас будет фабричный класс для Phase1, для Phase2 и т. Д. В последнем случае вместо времени компиляции вы выбираете время выполнения.

1 голос
/ 05 февраля 2010

Установите флаг компиляции в Свойствах> построить, например. PHASE1

и в коде

#if PHASE1
  public class xxxx
#endif
...