如何取得 class 裡的 private property/field

在偵錯一些資料時,實體型別裡的資料有時是繼承而來

而物件裡的方法,也常常會使用到基底的方法或是參數

雖然這些資料的出發點是不希望開發者去在意的

若是可以拿到這些資料,在偵錯上有時反而可以幫上一些忙

在之前的文章有提到怎麼反過反射拿到私有方法,進行測試

class 裡有field 跟 property 的區分,而透過反射取得的方法也是不同的

若是想看到 baseClass 的 private property/field 其實也能透過反射取得

在 .net 裡,只要是實體型別的資料,大多都能透過反射取得

var b = new B(123);
var prop = b.GetType().GetProperty("ID", BindingFlags.NonPublic | BindingFlags.Instance);
prop.GetValue(b).Dump();
var field = b.GetType().GetField("_test", BindingFlags.NonPublic | BindingFlags.Instance);
field.GetValue(b).Dump();
var baseField = b.GetType().BaseType.GetField("_id", BindingFlags.NonPublic | BindingFlags.Instance);
baseField.GetValue(b).Dump();



public class BaseC
{
   private readonly int _id;
   
   public  BaseC(int id)
   {
     _id = id;
   }
}

public class B: BaseC
{
   private readonly int _test;
   private int ID {set;get;}
   public B(int id): base(id)
   {
       _test = 110;
       ID = 999;
   }
}

實際輸出

參考資料

https://dotblogs.com.tw/AceLee/2023/06/21/133023

https://stackoverflow.com/a/6961970