C#面试题更新 2026-08-03

在 C# 开发中,基于反射机制实现对象实例的创建,具体可以采取哪些方法?

考察说明

考查对 C# 反射机制中创建实例相关 API 的掌握与运用能力

回答思路

  1. 【回答框架 1】反射创建实例的核心是获取类型信息后调用 Activator 或 ConstructorInfo 完成实例化。首先通过 Type.GetType、Assembly.GetType 或 typeof 获取目标类型的 Type 对象,作为创建实例的前提。
  2. 【回答框架 2】使用 Activator.CreateInstance(Type) 可调用无参构造器创建对象,若需传递构造参数,则使用 Activator.CreateInstance(Type, object[]) 按顺序传入参数;对于泛型类型,可先获取泛型定义再通过 MakeGenericType 指定类型实参后创建。
  3. 【回答框架 3】另一种方式是获取 ConstructorInfo:通过 Type.GetConstructor 或 GetConstructors 筛选目标构造器,随后调用 Invoke(object[]) 传入参数完成实例化,适合需要精细控制构造器选择或非公共构造器的场景,比如私有构造器可通过 BindingFlags 获取后调用。
  4. 【回答框架 4】如果类型来自程序集且类型名已知,可使用 Assembly.GetType 配合完整类型名(含命名空间)获取 Type,再按上述方式创建;若类型名未知但基于接口或基类,可扫描程序集内所有类型筛选匹配项后实例化。
  5. 【回答框架 5】创建实例后通常需结合反射调用其成员或赋值属性,注意 SetValue 与 GetValue 的用法,以便完成后续操作;若实例化频繁,可缓存 Type 与 ConstructorInfo 以提升性能。
  6. 【关键点 1】通过 Type 对象配合 Activator.CreateInstance 可创建有参或无参实例
  7. 【关键点 2】使用 ConstructorInfo.Invoke 可精确调用指定构造器,包括私有构造器
  8. 【关键点 3】泛型类型需先用 MakeGenericType 生成构造类型再创建实例
  9. 【关键点 4】频繁操作时缓存 Type 与 ConstructorInfo 以提升反射性能
  10. 【关键点 5】注意区分值类型与引用类型在反射创建时的行为差异
  11. 【易错点 1】无默认构造器时 Activator.CreateInstance 会抛 MissingMethodException,应改用 ConstructorInfo
  12. 【易错点 2】非公共构造器默认不可访问,需添加 BindingFlags.NonPublic 与 Instance 标志
  13. 【易错点 3】忽略程序集加载问题时可能得到 null 的 Type 对象,必须检查后再创建实例