Type.CreateInstance不会比Activator.CreateInstance更有意义吗?

时间:2010-03-09 19:24:30

标签: c#

1)如果我们想在运行时创建一个给定类型的实例(因此使用后期绑定),那么我们需要调用Activator.CreateInstance。但是如果Type类有这样的方法会不会更有效?如果没有别的,Type.CreateInstance可以返回强类型实例而不是System.Object?!

2)Type.GetType使我们只能将包含该类型的程序集的友好名称传递给它,因此它不允许我们指定此程序集的绝对路径。

任何想法为什么Type.GetType允许我们指定程序集的绝对路径是一个坏主意?

感谢名单

6 个答案:

答案 0 :(得分:3)

Type有一个目的:它在运行时环境中定义唯一的“类型”。

保持Activator一个单独的类型,以及Assembly的汇编信息,是一件好事。拥有定义单一用途和用法的小类是更好的设计。

Activator.CreateInstance移至Type不会提高效率 - 可能会更容易在您的特定方案中概念化 ,但它会导致类型变得更大,更复杂。我个人觉得当前的设计非常干净和漂亮,很高兴他们让Type类在定义类型方面独一无二,并将其他信息(例如Assembly信息和构造)留在不同的类型中。

答案 1 :(得分:2)

关于为什么Type.GetType不允许您指定程序集的完整路径的问题,我们再次回到单一责任原则。 Assembly.Load是如何加载程序集的,Type.GetType仅适用于当前加载的程序集。

答案 2 :(得分:1)

  1. 激活类型可能需要使用COM互操作和远程处理,因此使用类型处理就是在一个篮子中放置太多鸡蛋(又名设计不佳)。你有Activator.CreateInstance< T>(),但你需要在编译时知道类型。

答案 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实例。