You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:21:32