Activator.CreateInstance 抛出 MissingMethodException 是因为默认只查找 public 无参构造函数;若类型无该构造、参数类型/顺序不匹配、或泛型未闭合,均会触发此异常。

Activator.CreateInstance 为什么有时抛出 MissingMethodException
因为 Activator.CreateInstance 默认只找无参构造函数。如果目标类型没有 public 无参构造,或者你传了参数但类型不匹配、顺序不对,就会直接报 MissingMethodException。
常见踩坑点:
- 类写了带参构造,又没显式声明无参构造 → 编译器不会自动补,反射就找不到
- 传入参数是
int,但构造函数参数是long或object→ 不会自动装箱或隐式转换,必须类型严格一致 - 泛型类型未闭合(比如
typeof(List))→ 必须用MakeGenericType先构造具体类型
创建带参实例的正确写法
必须显式指定参数类型数组和参数值数组,二者顺序、数量、类型要完全对应。
var type = typeof(MyClass);
var args = new object[] { "hello", 42 };
var argTypes = new Type[] { typeof(string), typeof(int) };
var instance = Activator.CreateInstance(type, argTypes, args);
更安全的做法是先检查构造函数是否存在:
- 用
type.GetConstructors()查看可用构造器 - 对每个
ConstructorInfo调用GetParameters()确认参数签名 - 避免硬编码索引,优先按参数名或类型匹配,而非位置
泛型类型怎么用 CreateInstance
不能直接对开放泛型(如 List)调用 CreateInstance,必须先构造闭合类型。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
var openType = typeof(List<>); var closedType = openType.MakeGenericType(typeof(string)); var list = Activator.CreateInstance(closedType); // 返回 object,需 cast
注意:
-
MakeGenericType抛异常很常见:传入null、类型数不匹配、泛型约束不满足都会失败 - 返回值是
object,若需强类型操作,得用as IList或(IList,后者可能抛)list InvalidCastException
性能差在哪?有没有替代方案
Activator.CreateInstance 每次调用都走完整反射流程,包括构造函数查找、参数验证、JIT 编译委托 —— 在高频场景(如对象池、序列化循环)中开销明显。
更高效的方式:
- 缓存
ConstructorInfo,再用ConstructorInfo.Invoke()(仍慢,但省去查找) - 用
Expression.Lambda编译一次构造委托,后续直接调用(推荐) - .NET 5+ 可考虑
System.Runtime.CompilerServices.Unsafe的Unsafe.As配合字段初始化(仅限无构造逻辑的 POD 类型)(null)
真正复杂的是带依赖注入或生命周期管理的场景 —— 这时候别硬刚 Activator,该交出去给 IServiceProvider 就交出去。






