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为空的情况?

谢谢你的帮助

根据你的假设,如果你的类型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调用构造函数的东西,则抛出异常。

因此,对您来说,这可能失败的唯一方式是被调用的构造函数返回空值。但这是不可能发生的,因为如果在构造过程中没有引发异常,那么构造函数调用将返回对新对象的引用,如果引发异常,则捕获它。

相关内容

  • 没有找到相关文章

最新更新