动态实例化类时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
相关产品推荐
相关产品推荐

