是否有可能在父类中创建变量,每个派生类型初始化一次?

时间:2012-06-29 10:32:54

标签: c# c#-4.0

我正在使用IDataErrorInfo接口来验证我的实体。只要验证逻辑从属性读取元数据,对于所有实体都是相同的,所以我创建了类

public class DataErrorInfo : IDataErrorInfo

所有实体都从中汲取营养。事实是,我希望缓存派生类的反射信息以加快验证速度,因此每个实体类型应该在每个运行的应用程序中初始化此缓存一次。

我正在考虑使用static readonly字段,但发现它是用第一个使用的实体类型的反射信息初始化的,所以如果有实体A和实体B,并且实体A首先被访问,实体B将拥有实体A反射缓存。

2 个答案:

答案 0 :(得分:2)

您可以使用Dictionary<Type, DataErrorInfo>作为Singleton实施。

Singleton模式强制内存中只存在一个DictionaryDictionary本身将强制执行约束,即每个类型将一个条目作为Key获取。您的Value将是您想要缓存的任何反射信息。在这种情况下,它看起来像是DataErrorInfo

答案 1 :(得分:1)

在泛型类中,如果你有一个静态的,它可以用于封闭的泛型类型。 将您的基类定义为通用(具有一些奇怪但有效的约束)

public class DataErrorInfo<T> : IDataErrorInfo where T : DataErrorInfo<T>{
...
}

然后你定义你的派生类(注意派生类本身作为T传递给基础泛型类型)

public class EntityClass : DataErrorInfo<EntityClass>{
...
}

这样任何静态都限定为派生类而不是父类,只要你不这样做

public class AnotherEntityClass : DataErrorInfo<EntityClass>{
...
}