0

以下のクラスでは、コンパイラーにPropCそのセットかどうかを強制的にチェックさせ、そうでない場合はコンパイルモードでエラーを表示させたいと考えています。

public class ClassA 
{
    public object PropA { get; set; }
    public object PropB { get; set; }
    public object PropC { get; set; }        
}

PostShartを使用してカスタム属性を作成できることはわかっていますが、.NET 組み込みクラスを使用したいと考えています。

4

3 に答える 3

1

これは、.NET フレームワークの既定の機能ではありません。

ただし、Code Contracts パッケージを使用して Object Invariants を保証できます。

クラスで静的コード分析を実行するように設定を構成して、検証可能な不変条件が満たされていることを確認できます。フォールバックとして、無効な戻り値でプロパティにアクセスすると実行時エラーまたはデバッグ アサーションが発生するため、これらのコントラクトの実行時の安全性が得られます。これは、コード コントラクト パッケージがコンパイル中にコードの書き換えを実行し、追加のコードを挿入してコントラクトを検証することによって実現されます。

これらの動作はすべて、構成する設定に依存することに注意してください。パッケージは複雑すぎてスタックオーバーフローの回答で説明できませんが、http://research.microsoft.com/en-us/projects/contracts/userdoc.pdfでマニュアル/ドキュメントを読むことができます。

于 2012-09-20T00:33:25.937 に答える
0

あなたが求めているものは、コンパイル時ではなく、実行時にのみ利用可能です。プロパティが設定されているかどうかを確認するには、単体テストを使用する必要があります。

于 2012-09-20T00:12:25.460 に答える
0

私はあなたのプログラムが終了するかどうかを確認するのと似ていますが、より多くの範囲のバージョンが必要だと思います. 理論上は可能ですが、C# コンパイラはそれを行う方法を提供していません。「使用前にプロパティが割り当てられているかどうか」というより広範なチェックは、コンパイル時にはまったく不可能だと思います。

リファクタリングの方が良いかもしれません。無効なオブジェクトの作成を単に許可しない場合は、そのようなオブジェクトがプログラムに存在しないことを証明する方がはるかに簡単です。つまり、ファクトリメソッドパターンはおそらく1つのオプションです:

public class ClassA 
{
   public object PropC { get; private set; }        
   private ClassA (){};
   public Create (object propC)
   {
      return new ClassA{ PropC = propC };
   }
 }
于 2012-09-20T00:12:13.127 に答える