我有一个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)?
答案 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方法都返回自己的类型,因为它们是从通用基类派生的。