2

クラスHierarchicalDictionaryと、Territory、Departmentなどの派生クラスがあります。HierarchicalDictionaryから派生するすべてのクラスに、ビルド中にそのクラスのタイプ(Territory、Departmentなど)のプロパティ「Hierarchy」が含まれるように制御したいと思います。 。そうでない場合は、ビルドを失敗させたいと思います。

つまり、TerritoryにTerritoryタイプのプロパティ階層が含まれていない場合、またはDepartmentにDepartmentタイプのプロパティ階層が含まれていない場合、ビルドは失敗するはずです。

だから私はコンパイル中にそのようにチェックされた状態にしたい(擬似コード):

foreach (Class1 that derive from HierarchicalDictionary)
  if(!(Class1 contains property Hierarchy of type Class1))
    build fail

CodeContractsについて考えましたが、ビルド中に条件によって失敗する可用性があるかどうかはわかりません。適切な方法があるのでしょうか?

UPD:私の状況に対する追加の制限について説明しようと思います:

HierarchicalDictionaryは(データベースに)格納されていないクラスです。また、派生クラスが格納されるため、対応するテーブルにはデータベース内の自己参照フィールドが含まれます。HierarchicalDictionaryからクラス「C1」を派生させる場合、このクラスにはタイプ「C1」のプロパティ(またはフィールド)「Hierarchy」が正確に含まれている必要があります。[ClassMustContainHierarchyFieldOfMyselfType]属性のように。そして、コンパイル中にその事実を制御したいと思います。HierarchicalDictionaryから派生したクラス「C2」があり、フィールド(またはプロパティ)「publicC2 Hierarcy」が含まれていない場合、ビルドは失敗するはずです。

「組み込み」ソリューションがない可能性があります。ビルド前またはビルド後のイベント、またはその他のもの(CodeContractsなど)を使用できますか?

4

2 に答える 2

4

HierarchicalDictionaryできる場合は、基本クラスのabstractようにプロパティを定義できます。abstractこれにより、すべてのサブクラスで具体的な実装が強制されます。

基本クラスのインスタンスを作成できるようにする必要がある場合はHierarchicalDictionary、インターフェイスを追加してプロパティを強制できます。

于 2012-09-03T12:08:32.913 に答える
1

さて、次のようなことができるかもしれません:

// GENERIC base class 
public abstract class A<T> 
{
    public abstract T GetMyType {get;}  
}

//derived ones 
public class B : A<B>
{
   public override B GetMyType
   {     
      get {
        return new B();     
      }
   }
}


public class C : A<C>
{
   public override C GetMyType 
   {     
      get  {
         return new C();        
      }
   }
}

そしてコードの後:

new B().GetMyType.ToString(); //B 
new C().GetMyType.ToString(); //C

したがって、抽象メソッドで制約を作成します。さらに、オーバーライドされたすべてのメソッドは、ジェネリック基本クラスから派生しているため、独自の型を返します。

于 2012-09-03T12:35:58.773 に答える