如何通过反射获取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的字段,这样就精准定位到Instance1和Instance2了。 - 读取静态实例与属性值:静态字段的
GetValue方法不需要传入实例(传null就行),拿到实例后,通过GetProperty获取MyParam的属性信息,再调用GetValue读取属性值。
额外注意点:
- 如果你的类里还有其他非
MyClass类型的静态字段,过滤条件会自动排除它们,避免类型转换错误。 - 哪怕类的构造函数是私有(就像你示例里那样)也完全不影响,因为我们是读取已经创建好的静态实例,不需要触发构造函数。
- 使用
nameof(MyClass.MyParam)代替硬编码字符串"MyParam",能避免后续属性名修改时出现拼写错误。
内容的提问来源于stack exchange,提问作者Bogdan B




