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

在.NET 4.5(C#)中如何获取FormStore类内部类并创建实例列表?

Got it! 在.NET 4.5的C#环境里,要获取FormStore类的所有内部类并创建它们的实例列表,核心思路就是利用反射——毕竟内部类默认是对外隐藏的,常规方式没法直接访问。下面给你一步步拆解实现方法:

获取FormStore内部类并创建实例列表的完整方案

步骤1:获取所有内部类的Type对象

首先得拿到FormStore的类型信息,然后通过反射API捞取所有嵌套类(包括私有、内部、公共的内部类)。这里一定要指定正确的绑定标志,不然会漏掉非公开的内部类:

var formStoreType = typeof(FormStore);
// 获取所有嵌套类,覆盖私有、内部、公共的实例/静态类
var allNestedTypes = formStoreType.GetNestedTypes(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static
);
// 如果只需要可实例化的内部类(排除静态嵌套类),过滤一下
var instantiableNestedTypes = allNestedTypes.Where(t => !t.IsStatic).ToList();

解释下绑定标志:

  • BindingFlags.NonPublic:捕获private/internal修饰的内部类
  • BindingFlags.Public:防止漏掉用public修饰的嵌套类
  • BindingFlags.Instance/BindingFlags.Static:同时包含实例类和静态类,后续按需过滤

步骤2:创建内部类实例

遍历筛选后的类型,用Activator.CreateInstance创建实例。这里要注意:内部类的构造函数可能也是私有/内部的,所以调用时要指定对应的绑定标志,避免抛出异常:

var instanceList = new List<object>();
foreach (var type in instantiableNestedTypes)
{
    try
    {
        // 支持调用私有/内部的无参构造函数
        var instance = Activator.CreateInstance(
            type,
            BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
            null,
            null,
            null
        );
        instanceList.Add(instance);
    }
    catch (MissingMethodException)
    {
        Console.WriteLine($"⚠️ 无法创建{type.Name}实例:没有可用的无参构造函数");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"❌ 创建{type.Name}实例失败:{ex.Message}");
    }
}

如果内部类需要带参数的构造函数,你可以先通过type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)获取构造函数对象,再传入对应参数调用Invoke方法创建实例。

完整可运行示例

下面是包含测试用FormStore类的完整代码,直接就能跑:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

// 示例FormStore类,包含多种类型的内部类
public class FormStore
{
    private class PrivateInnerForm { }
    internal class InternalInnerForm { }
    public class PublicInnerForm { }
    private static class StaticInnerForm { } // 会被过滤掉
    private class InnerFormWithParamConstructor
    {
        public InnerFormWithParamConstructor(string name) { }
    }
}

class Program
{
    static void Main()
    {
        var formStoreType = typeof(FormStore);
        var instantiableTypes = formStoreType.GetNestedTypes(
            BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static
        ).Where(t => !t.IsStatic).ToList();

        var instances = new List<object>();
        foreach (var type in instantiableTypes)
        {
            try
            {
                var instance = Activator.CreateInstance(
                    type,
                    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
                    null,
                    null,
                    null
                );
                instances.Add(instance);
                Console.WriteLine($"✅ 成功创建{type.Name}实例");
            }
            catch (MissingMethodException)
            {
                Console.WriteLine($"⚠️ 跳过{type.Name}:无无参构造函数");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"❌ {type.Name}实例创建失败:{ex.Message}");
            }
        }

        Console.WriteLine($"\n最终获取到{instances.Count}个内部类实例");
    }
}

关键注意事项

  1. .NET 4.5完全支持上述反射API,不存在版本兼容问题
  2. 如果内部类继承了统一的基类/接口,可以将实例列表的类型改为对应的泛型列表(比如List<BaseForm>),前提是所有内部类都实现了该类型
  3. 若需要处理带参数的构造函数,需单独获取构造函数并传入匹配的参数

内容的提问来源于stack exchange,提问作者Amir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:00