我有一组类,它们都应该有一个静态字符串成员。我们将其命名为“TABLENAME”。所有这些类的基类
ClassA<T>
是一个模板类,都有一个名为 TABLENAME
的受保护静态字符串成员。由于 dotnet 处理模板类的静态成员的方式,每个派生类都会获得自己的静态成员实例。此外,每个类都有自己的静态构造函数,用于设置 TABLENAME
。到目前为止一切顺利。
我遇到的问题是双重的。
ClassA
的子类似乎能够访问其他子类的TABLENAME
。即ClassAB
可以参考ClassAC.TABLENAME
。ClassAC.TABLENAME
访问 ClassAB
不会触发 ClassAC
中的静态构造函数。是否有任何好的模式可以为一组类提供一组静态成员,其中每个派生类都有自己的一组值,并且在设置这些值之前无法访问这些值。
现在我可以通过向基类添加一个名为
Tablename()
的非静态方法来解决这个问题,该方法返回静态字符串成员 TABLENAME
。在 ClassAB
需要从 TABLENAME
访问 ClassAC
的情况下,我可以创建 ClassAC
的实例并调用 Tablename()
。这将触发 ClassAC
的静态构造函数。我不喜欢这个解决方案,因为您可能会意外地直接访问 ClassAC.TABLENAME
,这将返回 null,因为它不会触发 ClassAC
的静态构造函数。
我想要一组静态成员的原因是我不想在每个派生类中多次初始化这些字段。
想法、想法?
根据设计,声明类的静态成员在所有子类之间共享。因此,
TABLENAME
中的 ClassA
静态成员将在其所有子类之间共享。 (来源:https://stackoverflow.com/a/5851501/17985195)
为了解决您的问题,
我想要一组静态成员的原因是我不想在每个派生类中多次初始化这些字段。
您可以使用带有初始值的自动属性。
因此,在您的派生类中,将您的成员设置为:
public string TABLENAME { get; set; } = "Initial Table Name"; // C# 6 or higher
这样,当实例化该子类时,您的
TABLENAME
字段将使用 "Initial Table Name"
进行初始化,并且您可以使其对每个子类都是唯一的,这本质上就是您想要的。