日期:2014-05-20  浏览次数:21004 次

关于类反射的问题
最近在看CS源码,看到DataProviders类里面利用反射创建对象实例的方法,其中用了两种方法,一种是利用Activator.CreateInstance()
另外一直是利用ConstructorInfo.Invoke()。
搜索了整个解决方案,发现有多处地方使用了这两个方面,但是我怎么看也看不出这两种方法的区别,为什么有的地方要用Activator.CreateInstance(),有的地方却要用ConstructorInfo.Invoke()呢?


------解决方案--------------------

Activator类支持动态创建.NET程序集和COM对象。可以通过CreateComInstanceFrom、CreateInstance、CreateInstanceFrom、GetObject四个静态方法加载COM对象或者程序集,并能创建指定类型的实例。 
http://blogs.msdn.com/haibo_luo/archive/2005/11/17/494009.aspx
------解决方案--------------------
ConstructorInfo代表一个已知的类的已知签名的构造函数对象,主要通过GetConstructor获取,如果你的程序流程里面需要连续创建多个相同对象,并且调用参数一样的构造函数,用它可以减少多次反射查找;

Activator主要用于方法的动态调用,如果有几个重载的构造函数,要到程序执行时才可以确定调用哪一个,就需要用Activator.CreateInstance.
------解决方案--------------------
学习了.
------解决方案--------------------
ConstructorInfo 用于发现构造函数的属性及调用构造函数。通过对 ConstructorInfo 调用 Invoke 来创建对象,其中 ConstructorInfo 是由 Type 对象的 GetConstructors 或 GetConstructor 方法返回的。
Activator.CreateInstance 方法通过调用与指定参数匹配程度最高的构造函数来创建在程序集中定义的类型的实例。如果没有指定任何参数,则将调用不带任何参数的构造函数(即默认构造函数)。
------解决方案--------------------
探讨
ConstructorInfo.Invoke()呢?我看了源代码,发现有的地方用的是ConstructorInfo.Invoke()。有的地方用的是Activator,不知道有什么区别

------解决方案--------------------
不论哪一种方式,都要在内部 GetConstructors ,然后判断所有实例化方法中哪一个最合适匹配用户输入的参数,然后调用之。
------解决方案--------------------
探讨
ConstructorInfo代表一个已知的类的已知签名的构造函数对象,主要通过GetConstructor获取,如果你的程序流程里面需要连续创建多个相同对象,并且调用参数一样的构造函数,用它可以减少多次反射查找;

Activator主要用于方法的动态调用,如果有几个重载的构造函数,要到程序执行时才可以确定调用哪一个,就需要用Activator.CreateInstance.