使用反射获取对象所有属性(含私有)遇阻求助
解决C#获取类所有属性(含私有)的问题
我完全懂那种翻遍文档、试遍各种BindingFlags组合却还是拿不到私有属性的憋屈感!结合你用的VS2017 15.5.7和.NET Framework 4.7.2环境,大概率是BindingFlags的组合没凑全,或者没考虑到属性是实例还是静态的情况。
先给你一套完整的可运行示例
测试类示例
public class TestClass { public string PublicProp { get; set; } private string PrivateProp { get; set; } protected string ProtectedProp { get; set; } internal string InternalProp { get; set; } // 顺便覆盖静态属性场景 public static string StaticPublicProp { get; set; } private static string StaticPrivateProp { get; set; } }
正确的属性获取代码
要拿到所有实例+静态、公共+非公共(私有/保护/内部)的属性,必须把对应的BindingFlags组合起来,缺一不可:
using System; using System.Reflection; class Program { static void Main(string[] args) { Type targetType = typeof(TestClass); // 核心组合:覆盖实例/静态,公共/所有非公共类型 BindingFlags fullFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; // 获取所有符合条件的属性 PropertyInfo[] allProperties = targetType.GetProperties(fullFlags); foreach (var prop in allProperties) { Console.WriteLine($"属性名: {prop.Name}, 访问级别: {GetAccessLevel(prop)}"); } } // 辅助方法:直观显示属性的访问修饰符 private static string GetAccessLevel(PropertyInfo prop) { var getter = prop.GetMethod; if (getter.IsPublic) return "Public"; if (getter.IsPrivate) return "Private"; if (getter.IsProtected) return "Protected"; if (getter.IsAssembly) return "Internal"; return "Unknown"; } }
你可能踩过的几个坑
- 只加了
BindingFlags.NonPublic但没指定BindingFlags.Instance/BindingFlags.Static:默认GetProperties()只会取公共实例属性,单独加非公共标识会导致无结果返回。 - 混淆了
GetProperties和GetFields:你要的是属性(Property),不是字段(Field),别误调用成GetFields()了! - 遗漏了
BindingFlags.DeclaredOnly(可选):如果只想获取当前类自己声明的属性(不包含继承来的),需要在组合里加上这个标识。
如果替换成你的类后还是有问题,可以把你的类代码贴出来,我再帮你排查细节!
内容的提问来源于stack exchange,提问作者user2937874
相关产品推荐
相关产品推荐

