![](/img/trans.png)
[英]catch exception on a form which is created by Assembly.CreateInstance() method Reflection
[英]Reflection.Assembly.CreateInstance(string)
在.NET 4.0中,如果我有以下代码:
....
T instantiatedClass;
try
{
instantiatedClass = (T)assembly.CreateInstance(classFullName);
}
catch (Exception ex)
{
errMsg = string.Format("Error creating an instance of type \"{0}\".", classes.First().FullName);
throw new ApplicationException(errMsg, ex);
}
假设classFullName是程序集中的正确类型,并且类型“ T”实现了公共接口,是否有任何情况1)不会引发异常,并且2)instantiatedClass为null?
谢谢你的帮助。
根据您的假设,并且如果类型T始终是接口,则如果所讨论的接口未由创建的实例实现,或者如果类型没有可调用的默认构造函数,则直接强制转换为T将引发异常。
避免引发异常的更好方法是...
T interfaceVar = assembly.CreateInstance(classFullName) as T;
if (interfaceVar == null)
{
// oops, does not implement interface T
}
else
{
// yippee, it does implement interface T
}
您可以在目标程序集上使用反射来检查所需类型是否存在,是否具有默认构造函数以及是否实现了您感兴趣的接口。在这种情况下,您将完全避免创建实例,如果您愿意的话,知道它是否具有指定的接口。
如果没有默认的构造函数,或者在程序集中有效的classFullName假设是不正确的,或者任何阻止CreateInstance调用的方法调用构造函数,则会引发异常。
因此,对您而言失败的唯一方法是被调用的构造函数返回空值。 但这不会发生,因为如果在构造过程中未引发任何异常,则构造函数调用将返回对新对象的引用,并且如果引发异常,则可以捕获该异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.