在。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为空的情况?
谢谢你的帮助
根据你的假设,如果你的类型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调用构造函数的东西,则抛出异常。
因此,对您来说,这可能失败的唯一方式是被调用的构造函数返回空值。但这是不可能发生的,因为如果在构造过程中没有引发异常,那么构造函数调用将返回对新对象的引用,如果引发异常,则捕获它。