4

私はプロジェクトに取り組んでおり、プロジェクトの 1 つのフェーズで一連のクラスを設計して使用する必要があります。

次のフェーズでは、クラスとメソッドのセットは必要ありません。これらのクラスとメソッドのセットはアプリケーション全体で使用されるため、それらを他のクラスとして追加した場合、不要になったら手動で削除する必要があります。

クラスまたはクラスがインスタンス化される場所に属性を設定して、属性の値に基づいてそのインスタンス化とメソッド呼び出しを回避する方法はありますか。

設定のようなもの

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

この面での助けに感謝します。

4

5 に答える 5

3

C# コンパイラが#if ディレクティブに遭遇し、最終的に #endif ディレクティブが続くと、指定されたシンボルが定義されている場合にのみ、ディレクティブ間のコードがコンパイルされます。

#define FLAG_1
...
#if FLAG_1
    [Phase = 2]
    BridgingComponent bridgeComponent = new BridgeComponent();
#else
    [Phase = 2]
    BridgingComponent bridgeComponent;
#endif
于 2010-02-05T12:14:07.500 に答える
2

#ifを求めているようですね。

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

次に/define Phase2、ビルドに BridgingComponent を含めたい場合はコンパイル行で a を使用し、そうでない場合は使用しません。

于 2010-02-05T12:14:32.913 に答える
1

Properties>build eg PHASE1 でコンパイル フラグを設定します。

そしてコードで

#if PHASE1
  public class xxxx
#endif
于 2010-02-05T12:15:13.910 に答える
1

Spring.NET、NInject などの依存性注入フレームワークを使用することもできます。もう 1 つの方法は、ファクトリ メソッドを使用してクラスをインスタンス化することです。その後、Phase1、Phase2 などのファクトリ クラスが作成されます。後者の場合、コンパイル時ではなく実行時の選択があります。

于 2010-02-05T12:18:31.280 に答える
1

メソッドについては、Conditional属性を使用できます。

// 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");
    }
}

良いことは、シンボルが定義されていない場合、メソッド呼び出しがコンパイルされないことです。

于 2010-02-05T12:18:34.807 に答える