Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在父类中创建变量,每个驱动类型初始化一次?_C#_C# 4.0 - Fatal编程技术网

C# 是否可以在父类中创建变量,每个驱动类型初始化一次?

C# 是否可以在父类中创建变量,每个驱动类型初始化一次?,c#,c#-4.0,C#,C# 4.0,我正在使用IDataErrorInfo接口验证我的实体。只要验证逻辑从属性读取元数据,所有实体都是一样的,所以我创建了一个类 public class DataErrorInfo : IDataErrorInfo 所有的实体都从中被剥夺。问题是,我希望缓存派生类的反射信息以加快验证速度,所以每个实体类型应该在每个运行的应用程序中初始化此缓存一次 我本来想使用静态只读字段,但发现它是用第一个使用的实体类型的反射信息初始化的,所以如果有实体A和实体B,并且首先访问实体A,那么实体B将有实体A反射缓

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

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>{
...
}