商城首页欢迎来到中国正版软件门户

您的位置:首页 >C#使用Activator.CreateInstance动态创建对象

C#使用Activator.CreateInstance动态创建对象

  发布于2026-02-23 阅读(0)

扫一扫,手机访问

<p>Activator.CreateInstance 是 C# 中通过 Type 对象在运行时动态创建对象的方法,支持无参/带参构造函数、泛型类型及反射场景,但性能低于 new,高频调用需优化。</p>

C#怎么使用Activator.CreateInstance C#动态创建对象方法

Activator.CreateInstance 是 C# 中用于在运行时动态创建对象的常用方式,适用于类型未知、依赖注入、插件系统或反射场景。它不依赖编译期确定的类型,而是通过 Type 对象来实例化类。

基础用法:无参构造函数创建对象

最简单的情况是目标类有 public 无参构造函数:

var type = typeof(List<string>);
var list = Activator.CreateInstance(type); // 返回 object,需显式转换
// 或直接指定泛型类型(推荐)
var list2 = (List<string>)Activator.CreateInstance(typeof(List<string>));

注意:返回值是 object,如果需要强类型操作,必须强制转换或使用泛型重载(.NET Core 2.0+ / .NET 5+ 支持)。

带参数的构造函数创建对象

当类的构造函数需要参数时,可传入参数数组:

public class Person
{
    public Person(string name, int age) { /* ... */ }
}

var person = (Person)Activator.CreateInstance( typeof(Person), "张三", 25);

  • 参数顺序和类型必须严格匹配构造函数签名
  • 如果参数类型不匹配(如传入 long 但构造函数要 int),会抛出 ArgumentException
  • 支持值类型、引用类型、null(前提是构造函数允许)

性能与替代方案

Activator.CreateInstance 内部使用反射,比直接 new 慢不少,高频调用时建议缓存或换用更高效方式:

  • 对固定类型:用 Expression.Lambda 编译委托(一次性开销,后续极快)
  • .NET 5+ 推荐 Activator.CreateInstance<T>() 泛型方法,性能更好且类型安全
  • 依赖注入容器(如 Microsoft.Extensions.DependencyInjection)更适合管理生命周期和依赖关系

常见问题与注意事项

  • 目标类型必须有可访问的构造函数(private 构造函数需配合 BindingFlags,但不推荐)
  • 静态类、抽象类、接口无法实例化,会抛出 InvalidOperationException
  • 泛型类型需先构造(typeof(List<>).MakeGenericType(typeof(int))),再传给 CreateInstance
  • 跨程序集时确保类型已加载,否则抛出 FileNotFoundExceptionTypeLoadException

基本上就这些。用对场景很实用,但别在热路径里反复调用 —— 不复杂但容易忽略性能代价。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注