You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过反射获取C#类静态实例的公共属性值

通过反射获取类静态实例的公共属性值

没问题,针对你这个需求,咱们可以通过C#的反射API一步步实现,我直接给你完整的代码示例,再拆解每个步骤的作用:

using System;
using System.Linq;
using System.Reflection;

public record MyClass
{
    public static MyClass Instance1 = new(true);
    public static MyClass Instance2 = new(false);
    public bool MyParam { get; init; }
    private MyClass(bool myParam) { MyParam = myParam; }
}

class Program
{
    static void Main()
    {
        // 1. 获取MyClass的Type对象,这是反射操作的核心入口
        Type myClassType = typeof(MyClass);

        // 2. 筛选出所有公共的、类型为MyClass的静态字段
        var staticInstanceFields = myClassType.GetFields(BindingFlags.Public | BindingFlags.Static)
            .Where(field => field.FieldType == myClassType)
            .ToList();

        // 3. 遍历每个静态实例字段,获取实例并读取MyParam属性
        foreach (var field in staticInstanceFields)
        {
            // 静态字段不需要实例对象,所以GetValue传null即可拿到实例
            MyClass instance = (MyClass)field.GetValue(null);
            
            // 获取MyParam属性的值,这里用nameof避免硬编码字符串
            bool myParamValue = (bool)myClassType.GetProperty(nameof(MyClass.MyParam)).GetValue(instance);
            
            Console.WriteLine($"静态实例 {field.Name} 的 MyParam 值:{myParamValue}");
        }
    }
}

关键步骤解释:

  • 获取Type对象typeof(MyClass)拿到目标类的元数据信息,所有反射操作都基于它展开。
  • 筛选静态实例字段GetFields指定BindingFlags.Public | BindingFlags.Static来获取公共静态字段,再通过Where过滤出类型为MyClass的字段,这样就精准定位到Instance1Instance2了。
  • 读取静态实例与属性值:静态字段的GetValue方法不需要传入实例(传null就行),拿到实例后,通过GetProperty获取MyParam的属性信息,再调用GetValue读取属性值。

额外注意点:

  • 如果你的类里还有其他非MyClass类型的静态字段,过滤条件会自动排除它们,避免类型转换错误。
  • 哪怕类的构造函数是私有(就像你示例里那样)也完全不影响,因为我们是读取已经创建好的静态实例,不需要触发构造函数。
  • 使用nameof(MyClass.MyParam)代替硬编码字符串"MyParam",能避免后续属性名修改时出现拼写错误。

内容的提问来源于stack exchange,提问作者Bogdan B

火山引擎 最新活动