C# 是否可以在父类中创建变量,每个驱动类型初始化一次?
我正在使用IDataErrorInfo接口验证我的实体。只要验证逻辑从属性读取元数据,所有实体都是一样的,所以我创建了一个类C# 是否可以在父类中创建变量,每个驱动类型初始化一次?,c#,c#-4.0,C#,C# 4.0,我正在使用IDataErrorInfo接口验证我的实体。只要验证逻辑从属性读取元数据,所有实体都是一样的,所以我创建了一个类 public class DataErrorInfo : IDataErrorInfo 所有的实体都从中被剥夺。问题是,我希望缓存派生类的反射信息以加快验证速度,所以每个实体类型应该在每个运行的应用程序中初始化此缓存一次 我本来想使用静态只读字段,但发现它是用第一个使用的实体类型的反射信息初始化的,所以如果有实体A和实体B,并且首先访问实体A,那么实体B将有实体A反射缓
public class DataErrorInfo : IDataErrorInfo
所有的实体都从中被剥夺。问题是,我希望缓存派生类的反射信息以加快验证速度,所以每个实体类型应该在每个运行的应用程序中初始化此缓存一次
我本来想使用
静态只读
字段,但发现它是用第一个使用的实体类型的反射信息初始化的,所以如果有实体A和实体B,并且首先访问实体A,那么实体B将有实体A反射缓存。您可以使用实现为A的字典
Singleton模式强制内存中只存在一个字典。字典
本身将强制每个类型获得一个条目作为键
的约束。您的值将是您希望缓存的任何反射信息。在这种情况下,它看起来像是泛型类中的DataErrorInfo
,如果您有一个静态类,那么对于关闭的泛型类型,您可以利用它。
将基类定义为泛型(具有看起来有些奇怪但有效的约束)
公共类DataErrorInfo:IDataErrorInfo其中T:DataErrorInfo{
...
}
然后像这样定义派生类(注意,派生类本身作为T传递给基泛型类型)
公共类EntityClass:DataErrorInfo{
...
}
这样,只要您不按照下面的操作,任何静态变量的作用域都是派生类而不是父类
public class AnotherEntityClass : DataErrorInfo<EntityClass>{
...
}
公共类AnotherEntityClass:DataErrorInfo{
...
}
数据错误信息,其中T:DataErrorInfo
?你确定有一些T
可以保存吗?@Vlad是的,它可以保存所有从DataErrorInfo派生的类,但是你需要先找到一个T
,对吗?对于第一个派生类。(也许你可以举个例子?@vlad nope:)看看上面的例子。为什么是dv?该解决方案提供了一种解决OPs问题的机制。基类中的静态只读字典与单例字典一样有用。DataErrorInfo类可以在其构造函数中使用“GetType()”作为键来填充字典。假设获取“反射缓存”是一个昂贵的过程,使用“_ContainsKey(GetType())”(O(1)复杂度)昂贵的反射缓存进程可以对每个派生类型执行一次。即使在多级继承的情况下,字典对每个派生类型也始终有一个反射缓存。
public class EntityClass : DataErrorInfo<EntityClass>{
...
}
public class AnotherEntityClass : DataErrorInfo<EntityClass>{
...
}