C#反射判断私有属性报NullReferenceException的解决方法
问题原因
抛出NullReferenceException的核心原因有两个:
prop.GetSetMethod()默认只会查找公共的set访问器,对于没有公共set的属性(比如只读的Id、只有get方法的私有属性identify),该方法会直接返回null,后续直接访问IsPrivate属性就会触发空引用。- 私有属性的判断逻辑错误:原代码只检查了set访问器的可见性,但很多私有属性可能只有get访问器(比如示例里的
identify),根本不存在set方法,自然无法通过set判断属性可见性。
修复方案
调整反射逻辑:
- 调用
GetGetMethod/GetSetMethod时传入true参数,允许获取非公共的访问器 - 同时检查get、set访问器的可见性,只要属性不存在公共访问器,就判定为私有属性
- 访问访问器属性前先做空值校验,避免空引用
修复后的完整可运行代码:
using System; using System.Reflection; static void Main(string[] args) { var user = new User(5, "cash"); var bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic; foreach(var prop in typeof(User).GetProperties(bindingFlags)) { // 获取get、set访问器,允许查找非公共方法 var getMethod = prop.GetGetMethod(nonPublic: true); var setMethod = prop.GetSetMethod(nonPublic: true); // 判断是否为私有属性:属性的get和set都不是公共方法 bool isPrivateProp = !(getMethod?.IsPublic ?? false) && !(setMethod?.IsPublic ?? false); if (isPrivateProp) { Console.WriteLine("Private {0} = {1}", prop.Name, prop.GetValue(user, null)); } } Console.ReadLine(); } public class User { public int Id { get ; } public string Name { get; set; } private string identify { get { return Id.ToString() + Name; } } public User(int id,string name) { this.Id = id; Name = name; } }
运行后会正确输出私有属性identify的值:Private identify = 5cash
内容的提问来源于stack exchange,提问作者Jr. dective
相关产品推荐
相关产品推荐

