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

动态实例化类时Type.GetType返回null,实例化抛空值异常求助

为什么Type.GetType返回null,导致Activator.CreateInstance抛出空引用异常?

你遇到的这个问题特别常见,核心是没摸透Type.GetType的查找规则,我给你拆解下原因和对应的解决办法:

最常见的原因:缺少程序集信息

Type.GetType只传命名空间.类名的时候,默认只会在当前执行的程序集和**系统核心程序集(mscorlib/System.Private.CoreLib)**里找类型。如果你的Drv{id}.Fonte类在其他自定义程序集里,它根本找不到,自然返回null。

解决办法:用完整的程序集限定名

把类型名改成「命名空间.类名, 程序集名称」的格式,比如:

var typeName = $"Drv{id}.Fonte, YourAssemblyName";
var type = Type.GetType(typeName);

这里的YourAssemblyName是包含Drv{id}.Fonte类的程序集名称(不是dll文件名,一般和你的项目名称一致,右键项目→属性→应用程序→程序集名称里能看到)。

容易忽略的小问题:命名空间/类名拼写错误

可能你拼接的Drv{id}和实际的命名空间不匹配——比如id是1,但实际命名空间是Drv_1或者Drv01;或者Fonte类名大小写写错了(C#里类型名是严格区分大小写的)。

解决办法:先验证拼接后的类型名

把拼接好的typeName打印出来,和实际类的全名对比(右键Fonte类→转到定义,看顶部的namespace和类名),确保完全一致:

var typeName = $"Drv{id}.Fonte";
Console.WriteLine(typeName); // 检查输出是否和实际类的全名一致

小众情况:类不是公共(public)的

如果Fonte类的访问修饰符是internal或者private,默认的Type.GetType是找不到它的。

解决办法:明确指定绑定标志,或者改用程序集获取类型

可以先获取目标程序集,再用带绑定标志的重载方法查找:

// 先加载目标程序集
var assembly = Assembly.Load("YourAssemblyName");
// 查找非公共类型,忽略大小写(可选)
var type = assembly.GetType($"Drv{id}.Fonte", true, true);
// 创建非公共类的实例
var myObject = Activator.CreateInstance(type, true);

更可靠的替代方案:直接从程序集获取类型

比起依赖Type.GetType的默认查找逻辑,直接找到目标程序集再找类型会更稳定,比如:

// 方式1:如果程序集已经加载到当前应用域
var targetAssembly = AppDomain.CurrentDomain.GetAssemblies()
    .FirstOrDefault(a => a.GetName().Name == "YourAssemblyName");

// 方式2:如果程序集没加载,直接从文件加载
var targetAssembly = Assembly.LoadFrom(@"C:\YourProject\bin\Debug\YourAssembly.dll");

// 查找类型
var type = targetAssembly.GetType($"Drv{id}.Fonte");
if (type != null)
{
    var myObject = Activator.CreateInstance(type);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:46:17