2010-03-09 59 views
1

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

2)Type.GetType使我们能够进入它仅包含类型的组件的友好名称,因此它不会使得我们可以指定到该组件的绝对路径。

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

感谢名单

回答

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时,你需要知道程序集是在不同的上下文中加载的,并且可能会发生一些事情。所以Type.GetType没有这样的功能是件好事。

+0

“我不知道你的意思是绝对路径,因为从指定的位置加载程序集只有Assembly.LoadFrom做。”通过绝对路径我的意思是像C:\ SomeApp \ Assembly.dll – AspOnMyNet 2010-03-09 20:10:30

+1

所以答案是:这是一个坏主意,因为这些程序集是在不同的上下文中加载的。请参阅http://www.hanselman.com/blog/FusionLoaderContextsUnableToCastObjectOfTypeWhateverToTypeWhatever.aspx – 2010-03-09 20:23:23

+0

我跳过书中讨论上下文的部分,认为我不必了解它。 – AspOnMyNet 2010-03-09 20:52:03

1
  1. 激活类型可能需要互操作和远程处理与COM工作,所以其交易类型与被把太多的鸡蛋放在一个篮子里(又名设计差)。你确实有Activator.CreateInstance <T>(),但你需要知道在编译时的类型。
3

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

保留Activator一个单独的类型,以及用于装配信息的Assembly,是一件好事。拥有定义单一目的和用法的小班是一个更好的设计。

移动Activator.CreateInstanceType不会使其更有效率 - 这可能使其更容易在您的具体方案概念化,但它会导致类型变得更大,更复杂。我个人发现当前的设计非常干净漂亮,并且很高兴他们保持Type类定义类型的独特性,并将其他信息(例如程序集信息和构造)保留为单独的类型。

1

使用反射,您也可以搜索正确的ConstructorInfo并为您的类型调用它,然后您将获得一个强类型实例并能够将其延迟绑定。

EDIT ConstructorInfo.Invoke(对象[])
它不stronly类型的和一个将不得不使用类型T的新实例

+1

使用ConstructorInfo仍然不给你强大的输入:http://msdn.microsoft.com/en-us/library/6ycw1y17(v=VS.90).aspx任何时候使用反射都需要强制转换。 – 2010-03-09 19:34:37

+0

是的,你是对的!谢谢你的更新! =) – 2010-03-09 20:20:46

1

那么,你可以,只需要做一个额外的跳跃。您可以使用Type.GetConstructor()并调用返回的ConstructorInfo.Invoke()方法。

Type.GetType()也将采用程序集限定名称。或者你可以使用Assembly.Load()和Assembly.GetType()来获得Type实例。

+0

“Type.GetType()也将采用程序集限定的名称。”我意识到这一点。但为什么不能Type.GetType也允许我们指定程序集的路径? – AspOnMyNet 2010-03-09 20:12:13

+2

因为从绝对路径装载程序集非常罕见。如果你必须这样做,可以通过Assembly.LoadFile()额外跳转。不惜一切代价避免这种情况。 – 2010-03-09 20:38:14

2

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