0

好的,我对上面的那两件事有一点问题

以下情况:我有一个抽象类“发射器”。这个类有一个静态 Dictionary 来跟踪从它派生的所有类型。

例如,我有“LinearEmitter”类,这个类有一个静态构造函数。此构造函数将 typeof(LinearEmitter) 添加到字典中。现在的问题是,当我想使用来自 Emitter 的静态字典(静态方法“getMeEmitterFromID(int id)”)时,可能会发生“Emitter”的子代(例如 LinearEmitter)未初始化(我从文件,然后从“发射器”中的类中查找 id 并从中初始化一个实例)。

我如何确保每个 Child-class 之前都已初始化?(已将其自己写在字典中)?

当然其他人应该使用这个库,他们也应该使用静态构造函数将他们的类添加到“发射器”的字典中

有任何想法吗?

4

2 回答 2

2

Eric Lippert 刚刚有一个关于静态构造函数的精彩系列。

静态构造函数第 1 部分静态构造函数第 2 部分静态构造函数第 3 部分静态构造函数第 4 部分

总结一下你的情况有用的一点:静态构造函数被调用

  1. 就在第一次访问静态方法/字段之前。
  2. 就在第一次访问该类型的实例之前。

因此,您要么调用静态方法,Initialize()要么实例化从Emitter.

除此之外,我确信有更好的方法来解决您的问题,因为静态初始化程序的运行方式可能会随着不同的.NET/CLR版本而改变,如果您不需要,我不会依赖它。

于 2013-02-15T19:06:12.327 回答
0

我不会公开 Dictionary 本身,而是将其作为实现细节。然后你可以制作一个类似的方法GetByType(Type typeToGetFromDictionary)。现在,get 方法可以延迟加载它还没有的部分。

话虽如此,我同意您可能应该重新考虑架构的评论,因为这甚至可能没有必要。

于 2013-02-15T18:46:25.200 回答