如何访问通过反射获取的私有类型List的内容
访问私有内部类List内容的解决方案
嘿,这个场景我太熟悉了!既然你已经通过methodInfo.Invoke拿到了那个List<ToBeReflected+SomePrivateClassInsideIt>的实例,但因为内部类是私有的没法直接强转,咱们完全可以靠反射来搞定它,一步步来就行:
核心思路
因为List<T>本身实现了非泛型的IEnumerable接口,咱们可以先把拿到的object转成IEnumerable来遍历每个元素,然后对每个元素用反射获取它的字段/属性——毕竟你已经知道变量名称了,这就简单多了。
具体代码实现
假设你已经通过Invoke拿到了结果对象,接下来的处理代码如下:
// 假设这是你通过methodInfo.Invoke得到的结果 var listInstance = methodInfo.Invoke(null, null); // 先转成非泛型IEnumerable,遍历每个私有类实例 if (listInstance is IEnumerable items) { foreach (var item in items) { // 获取当前元素的实际类型(也就是那个私有内部类) Type privateClassType = item.GetType(); // 访问public的readonly字段Ints var intsField = privateClassType.GetField("Ints", BindingFlags.Public | BindingFlags.Instance); List<int> intsList = (List<int>)intsField.GetValue(item); Console.WriteLine($"Ints列表内容:{string.Join(", ", intsList)}"); // 访问public字段num1和num2 int num1 = (int)privateClassType.GetField("num1", BindingFlags.Public | BindingFlags.Instance).GetValue(item); int num2 = (int)privateClassType.GetField("num2", BindingFlags.Public | BindingFlags.Instance).GetValue(item); Console.WriteLine($"num1: {num1}, num2: {num2}"); } }
关键细节说明
- 用非泛型
IEnumerable遍历:不管List的泛型参数是啥私有类型,这个接口都能让我们逐个取出元素,避开强转的问题。 - 反射获取字段:
GetField方法需要指定正确的BindingFlags——如果是实例字段就加Instance,public字段加Public,要是遇到私有字段的话,再加上NonPublic就行。 - 类型转换:因为你已经知道字段的实际类型(比如
List<int>、int),所以直接安全转换就行。
如果私有类里有属性而不是字段,把GetField换成GetProperty,调用GetValue的逻辑是一样的哦!
内容的提问来源于stack exchange,提问作者5argon
相关产品推荐
相关产品推荐

