强制构建在某些条件下失败

时间:2012-09-03 12:05:48

标签: c# build constraints

我有一个HierarchicalDictionary类和一些派生类,例如Territory,Department等。 我想控制从HierarchicalDictionary派生的所有类在构建期间包含该类(Territory,Department等)类型的属性“Hierarchy”。如果不是这样,我希望构建失败。

即如果Territory不包含属性Territory类型的Hierarchy或Department不包含Department类型的属性Hierarchy,则build应该失败。

所以我希望在编译条件期间检查(伪代码):

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

我考虑过CodeContracts,但我不知道在构建期间是否存在因条件失败而导致的可用性。 可能有一些正确的方法吗?

UPD:我会尝试描述我的情况的其他限制:

HierarchicalDictionary未存储(在数据库中)类。并且存储派生类,因此相应的表包含数据库中的自引用字段。当我从HierarchicalDictionary派生类“C1”时,我的意思是,该类必须包含“C1”类型的属性(或字段)“Hierarchy”。与[ClassMustContainHierarchyFieldOfMyselfType]属性类似。我想在编译期间控制这个事实。如果我有类“C2”,它派生自HierarchicalDictionary并且不包含字段(或属性)“public C2 Hierarcy”,则构建应该失败。

可能没有任何“内置”解决方案。可能我可以使用预建或事后建立事件或其他任何事情(例如CodeContracts)?

2 个答案:

答案 0 :(得分:4)

如果HierarchicalDictionary可以是abstract,则可以在基类中将属性定义为abstract。这在每个子类中强制执行具体实现。

如果您需要能够创建基类HierarchicalDictionary的实例,则可以通过添加接口来强制执行该属性。

答案 1 :(得分: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

因此,您使用抽象方法创建约束,并且每个overriden方法都返回自己的类型,因为它们是从通用基类派生的。