C# 强制构建因某些条件而失败

C# 强制构建因某些条件而失败,c#,build,constraints,C#,Build,Constraints,我有一个类HierarchicalDictionary和一些派生类,例如Territory、Department等。 我想控制从HierarchycalDictionary派生的所有类在构建期间都包含该类类型(Territory、Department等)的属性“Hierarchy”。如果不是这样,我希望构建失败 也就是说,如果Territory不包含Territory类型的属性层次结构,或者Department不包含Department类型的属性层次结构,则生成应该失败 因此,我希望在编译期间像

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

也就是说,如果Territory不包含Territory类型的属性层次结构,或者Department不包含Department类型的属性层次结构,则生成应该失败

因此,我希望在编译期间像这样检查条件(伪代码):

我考虑过,但我不知道在构建过程中是否有可用性可以根据条件进行故障处理。 也许有什么合适的方法

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

HierarchyCalDictionary未存储(在数据库中)类。并且派生类被存储,所以相应的表在数据库中包含自引用字段。当我从HierarchycalDictionary派生类“C1”时,我的意思是,这个类必须包含类型为“C1”的属性(或字段)“Hierarchy”。类似于[ClassMustContainerHierarchyFieldOfMySelfType]属性。我想在编译过程中控制这个事实。若我有类“C2”,它派生自HierarchycalDictionary,并且不包含字段(或属性)“PublicC2 Hierarcy”,那个么构建应该失败


可能没有任何“内置”解决方案。可能是我可以使用生成前或生成后事件或其他任何东西(例如CodeContracts)

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


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

您可以执行以下操作:

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

因此,您可以使用抽象方法创建约束,加上每个被重写的方法都返回其自己的类型,因为它们是从泛型基类派生的。

是HierarchicalDictionary抽象的还是可以?HierarchicalDictionary本身不包含任何逻辑。它可能包含一些字段或属性。但我需要说明的是,每个派生类“C1”都包含属性“public1hierarchy”。像属性[shouldContainerHierarchyReferenceToMySelf],在编译过程中会被控制我不知道当前的情况是什么,但是如果你需要制作具体的
HierarchyCalDictionary
实例,那么有没有办法呢?我只是好奇,因为这可能是必要的…我不需要HierarchyCalDictionary类的“Hierarchy”属性。如果我声明它,它在每个派生类中都是HierarchicalDictionary类型的,不是吗?我希望它是某种类型的类,在这里声明它。我试图澄清我的问题。我不能使用方法,因为这个层次结构属性在数据库的datatable中有相应的字段。@mao:我编辑了我的文章到属性,请检查它是否符合您的需要。
// 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