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

如何访问通过反射获取的私有类型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:49