C#构造函数中如何判断当前this实例是否为静态成员
C# 构造函数内判断实例是否为类静态成员的方案
问题描述
需求是在类的构造函数中,判断当前正在构造的类T实例是否为T的静态成员。最初尝试通过检查this的相关特性实现判断,但始终未找到可行的判断依据。
对应实现场景的示例代码如下:
public class Thing { public static readonly List<Thing> ListOfStaticThings = new(); public static readonly Thing StaticThing1 = new ("StaticThing1"); public static readonly Thing StaticThing2 = new ("StaticThing2"); public static readonly Thing StaticThing3 = new ("StaticThing3"); public Thing NonStaticThing = new("NonStaticThing"); public string Name { get; set; } private Thing(string name) { Name = name; if(this.IsStatic) // 如何判断当前构造的实例是否为静态成员? { ListOfStaticThings.Add(this);} } }
核心疑问
如何识别构造函数中this引用的实例,是否是被标记了static特性的类成员?
补充说明
- 示例中的3个静态成员
StaticThing1/StaticThing2/StaticThing3,和非静态成员NonStaticThing,都会调用私有构造函数完成实例化,但只有静态成员对应的实例需要在构造阶段加入ListOfStaticThings集合。实际实现中,这类static readonly的类类型字段共有20个以上。 - 目前已经验证静态实例可以正常加入
ListOfStaticThings集合,该集合有多重用途:- 实现Enumeration Classes模式,存储类的所有合法可选实例(例如账户状态枚举值)
- 传入EF Core的
HasData方法完成数据表的种子数据填充 - 支撑单元测试中的数据校验,集合包含所有合法实例值,且随模型定义持久化保持一致
- 上述集合用途不属于本次问题讨论范围,核心诉求仅为找到构造函数内识别静态成员实例的方法,实现仅3个静态
Thing实例加入集合、排除非静态NonStaticThing实例的效果。
最终结论
你完全不需要额外实现这个判断逻辑:
如果在类T中定义了T类型的非静态成员,创建T实例时会递归触发该非静态成员的实例化,进而无限递归调用T的构造函数,直接导致栈溢出。实际能正常走完构造流程的只有静态成员对应的实例,根本不需要在构造函数中加额外判断区分实例是否属于静态成员,直接将构造完成的实例加入集合即可。
内容的提问来源于stack exchange,提问作者Wes H
相关产品推荐
相关产品推荐

