1)如果我们想在运行时创建一个给定类型的实例(因此使用后期绑定),那么我们需要调用Activator.CreateInstance。但是如果Type类有这样的方法会不会更有效?如果没有别的,Type.CreateInstance可以返回强类型实例而不是System.Object?!
2)Type.GetType使我们只能将包含该类型的程序集的友好名称传递给它,因此它不允许我们指定此程序集的绝对路径。
任何想法为什么Type.GetType允许我们指定程序集的绝对路径是一个坏主意?
感谢名单
答案 0 :(得分:3)
Type
有一个目的:它在运行时环境中定义唯一的“类型”。
保持Activator
一个单独的类型,以及Assembly
的汇编信息,是一件好事。拥有定义单一用途和用法的小类是更好的设计。
将Activator.CreateInstance
移至Type
不会提高效率 - 可能会更容易在您的特定方案中概念化 ,但它会导致类型变得更大,更复杂。我个人觉得当前的设计非常干净和漂亮,很高兴他们让Type类在定义类型方面独一无二,并将其他信息(例如Assembly信息和构造)留在不同的类型中。
答案 1 :(得分:2)
关于为什么Type.GetType不允许您指定程序集的完整路径的问题,我们再次回到单一责任原则。 Assembly.Load是如何加载程序集的,Type.GetType仅适用于当前加载的程序集。
答案 2 :(得分:1)
答案 3 :(得分:1)
使用Reflection,您也可以搜索正确的ConstructorInfo并为您的类型调用它,然后您将获得一个强类型实例并能够对其进行后期绑定。
修改强>
ConstructorInfo.Invoke(对象[])
它不是stronly-typed,在使用Type T的新实例之前,必须先进行类型转换。
答案 4 :(得分:1)
1)你可以,但我不确定这些是否更好然后使用Activator.CreateInstance
object obj = someType.GetConstructor(Type.EmptyTypes).Invoke(null);
object obj = someType.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
2)未使用完整的程序集限定名称来加载可能的意外类型,并且可能会出现here所述的奇怪结果。
指定加载程序集的位置只是Assembly.LoadFrom的作用。 Assembly.LoadFrom在较新的.Net版本中已弃用。原因是当你使用LoadFrom时,你需要知道程序集是在不同的上下文中加载的,unexpected事情可能会发生。所以Type.GetType没有这样的功能是件好事。
答案 5 :(得分:1)
嗯,你可以,只需要额外跳一下。您可以使用Type.GetConstructor()并调用返回的ConstructorInfo.Invoke()方法。
Type.GetType()也将采用程序集限定名称。或者您可以使用Assembly.Load()和Assembly.GetType()来获取Type实例。