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

C#反射判断私有属性报NullReferenceException的解决方法

问题原因

抛出NullReferenceException的核心原因有两个:

  • prop.GetSetMethod()默认只会查找公共的set访问器,对于没有公共set的属性(比如只读的Id、只有get方法的私有属性identify),该方法会直接返回null,后续直接访问IsPrivate属性就会触发空引用。
  • 私有属性的判断逻辑错误:原代码只检查了set访问器的可见性,但很多私有属性可能只有get访问器(比如示例里的identify),根本不存在set方法,自然无法通过set判断属性可见性。
修复方案

调整反射逻辑:

  1. 调用GetGetMethod/GetSetMethod时传入true参数,允许获取非公共的访问器
  2. 同时检查get、set访问器的可见性,只要属性不存在公共访问器,就判定为私有属性
  3. 访问访问器属性前先做空值校验,避免空引用

修复后的完整可运行代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:06:12