如何在未知参数类型时为Assembly.CreateInstance传入Object[]参数
在未知构造函数参数类型时使用Assembly.CreateInstance创建实例
你已经通过ConstructorInfo.GetParameters()拿到了构造函数的参数信息,接下来只需要根据每个参数的类型生成对应的值,再填充到参数数组中即可。以下是修改后的完整代码:
foreach (Type T in assembly.GetTypes()) { Console.WriteLine("Class Defined: " + T.FullName); ConstructorInfo ctor = T.GetConstructors()[0]; ParameterInfo[] CtorParams = ctor.GetParameters(); // 初始化参数值数组 object[] paramValues = new object[CtorParams.Length]; for (int i = 0; i < CtorParams.Length; i++) { ParameterInfo p = CtorParams[i]; Console.WriteLine(p.Name + ":" + p.ParameterType); // 根据参数类型生成对应值 if (p.ParameterType.IsValueType) { // 值类型取默认值,也可以根据需求设置自定义测试值 paramValues[i] = Activator.CreateInstance(p.ParameterType); // 示例:如果是int类型,设置为100 // if (p.ParameterType == typeof(int)) paramValues[i] = 100; } else if (p.ParameterType == typeof(string)) { // 字符串类型设置测试值,避免null paramValues[i] = "test_input"; } else { // 其他引用类型优先尝试创建实例,失败则设为null try { paramValues[i] = Activator.CreateInstance(p.ParameterType); } catch { paramValues[i] = null; } } } // 使用生成的参数数组创建类实例 Object obj = assembly.CreateInstance(T.FullName, false, BindingFlags.Default, null, paramValues, null, null); if (obj != null) { Console.WriteLine(obj.ToString()); } }
核心逻辑说明
- 通过
ParameterType.IsValueType判断是否为值类型,用Activator.CreateInstance生成默认值(比如int默认0、bool默认false) - 字符串类型单独处理,可设置自定义测试字符串,避免传入null引发异常
- 其他引用类型尝试创建实例,失败则设为null,确保代码能正常执行
如果需要更灵活的参数赋值(比如从配置读取、用户输入),可以在对应类型的分支里扩展逻辑,核心都是根据参数类型匹配对应的值。
内容的提问来源于stack exchange,提问作者silentkratos
相关产品推荐
相关产品推荐

