如何使用反射
在C#中可以使用:
Type t = Type.GetType("System.String");
但是下面的代码怎么回出错呢?
Type t = Type.GetType("System.Data.SqlClient.SqlDataAdapter");
望各位大虾指点
问题点数:0、回复次数:28Top
1 楼qimini(循序渐进)回复于 2003-09-01 14:41:46 得分 0
1、添加对System.Data.dll的引用
2、
using System.Data.SqlClient;Top
2 楼hustzxs(泰)回复于 2003-09-01 14:51:31 得分 0
我已经这样做了,可是还是不行啊!Top
3 楼qimini(循序渐进)回复于 2003-09-01 15:10:51 得分 0
System.Data命名空间下很多类都是如此错误!不知道是不是MS的bug :) 找思归吧
Top
4 楼qimini(循序渐进)回复于 2003-09-01 15:14:27 得分 0
大概有点思路了。System.Data命名空间下很多类都是非托管资源,用Type.GetType(...)取不到类型信息(System.Windows.Forms命名空间下也应该一样)
但我想不通了 为什么他们的实例GetType就可以呢???Top
5 楼qimini(循序渐进)回复于 2003-09-01 15:17:39 得分 0
A sample :
Type type=Type.GetType("System.Data.SqlClient.SqlCommand");
MessageBox.Show(type.FullName);//运行出错?
---
Type type=(new System.Data.SqlClient.SqlCommand()).GetType();
MessageBox.Show(type.FullName);//运行不出错?Top
6 楼snof(雪狼)回复于 2003-09-01 17:48:16 得分 0
在c#中总体为分,有两种类型,值类型和引用类型,
你在使用GetType的方法时也有两种,对对值类型你可能直接使用Type.GetType("")得到,
但是对地引用类型你必须创建实例,然后使用实例的GetType方法,Top
7 楼timmy3310(Tim)回复于 2003-09-01 18:02:59 得分 0
Type t = Type.GetType("System.Data.SqlClient.SqlDataAdapter,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
注意字符串的写法,不是本装配件或者mscorlib.dll中定义的类型必须加上装配件的信息Top
8 楼qqq123(Boreas)回复于 2003-09-01 19:28:34 得分 0
Type type=typeof(System.Data.SqlClient.SqlDataAdapter);Top
9 楼ArLi2003(阿利,MSN:url@163.com)回复于 2003-09-01 20:44:29 得分 0
System.Data.SqlClient.SqlCommand 非静态类,自身是一个对象,对type 而言是一个被动类型,只能在受实例化作用下(由于对象类型引用产生TYPE)才具备gettype() 所需要的值(Type),所以必须实例化Top
10 楼LA003(五音不全爱唱歌的洋)回复于 2003-09-01 20:56:55 得分 0
同意!
System.Data.SqlClient.SqlCommand 非静态类,自身是一个对象,对type 而言是一个被动类型,只能在受实例化作用下(由于对象类型引用产生TYPE)才具备gettype() 所需要的值(Type),所以必须实例化Top
11 楼LA003(五音不全爱唱歌的洋)回复于 2003-09-01 20:59:23 得分 0
System.Data.SqlClient.SqlCommand 非静态类,自身是一个对象,对type 而言是一个被动类型,只能在受实例化作用下(由于对象类型引用产生TYPE)才具备gettype() 所需要的值(Type),所以必须实例化
同意!!!!!
Top
12 楼qqchen79(知秋一叶)回复于 2003-09-02 06:02:13 得分 0
timmy3310(Tim) is right.
Type.GetType always searches in the calling assembly and mscorlib.dll if no assembly name provided in the string parameter. So System.String could be found at mscorlib.dll but System.Data.SqlClient.SqlDataAdapter can't.
You have to provide the assembly name in form of "Full Qualified Type Name". For Types defined in private non-Strongnamed assembly, it's the type name plus the assembly file name without extension. For Strong Named assembly, it's type name plus the assembly name, with version, culture and public key information.
Read Remarks section of Type.GetType(string) in MSDN.Top
13 楼qqchen79(知秋一叶)回复于 2003-09-02 06:13:41 得分 0
Type.GetType属于Reflection的一部分,Reflection可以用于动态解析类型。也就是说,即使编译开发期间没有建立对Assembly的引用,Type.GetType一样可以用于取得类型信息(相反,typeof是静态解析类型的,所以要求reference)。
如果你理解Namespace和Assembly的关系的话,就会明白单从类型的名称(包括Namespace部分)是不可能找到类型定义的,还必须知道定义类型的Assembly的名称和位置。所以在调用Type.GetType的时候必须要附带指明Assembly的信息。
>> 但我想不通了 为什么他们的实例GetType就可以呢???
Object.GetType的工作方式和上面的不同。因为你已经得到了对象实例(object),也就意味着在这之前你已经通过某种方式把定义对象的Assembly加载捣内存里了,不需要额外的信息来确定定义类型的Assembly。
Top
14 楼qimini(循序渐进)回复于 2003-09-02 09:42:36 得分 0
受教了 :)Top
15 楼win911(Vincent)回复于 2003-09-02 16:47:13 得分 0
学习!Top
16 楼mainone(现代)回复于 2003-09-19 17:30:07 得分 0
学习Top
17 楼Rossetti(飘)回复于 2003-09-22 10:30:38 得分 0
gzTop
18 楼xz_king(西煞魄工人)回复于 2003-09-22 11:03:35 得分 0
http://expert.csdn.net/Expert/topic/2214/2214138.xml?temp=.9888269
中已经解释的很好了。Top
19 楼scbeans(笨死)回复于 2003-09-25 11:57:16 得分 0
markTop
20 楼bbwolfcool(bb_wolf_cool)回复于 2003-11-18 14:20:28 得分 0
都是高手,没话说了Top
21 楼xixigongzhu(夕夕公主(※快乐在于自己※))回复于 2003-11-18 14:32:44 得分 0
如果是当前的Assembly或者默认的Assembly(mscorlib),GetType的时候是不需要指定Assembly的,除此之外,都必须指定Assembly的名字,也就是Type的属性AssemblyQualifiedName所代表的值。
对于String:
Type t = Type.GetType("System.String, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
因为属于mscorlib,所以也可以:t = Type.GetType("System.String");
但SqlDataAdapter必须指定Assembly名:
t = Type.GetType("System.Data.SqlClient.SqlDataAdapter, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");Top
22 楼winapp(木偶笨笨)回复于 2004-02-17 13:54:34 得分 0
好强啊!Top
23 楼mxch815(记住Amao这个名字,对你将来有好处)回复于 2004-02-17 14:07:03 得分 0
upTop
24 楼gujianxin(木头象)回复于 2004-02-17 16:11:42 得分 0
using System.Reflection;
public static void Test()
{
Type type = Type.GetType("DbTable2cs.Change");
Assembly ass = Assembly.GetAssembly(type);
Object obj = ass.CreateInstance("DbTable2cs.Change");
//转换为Change,调用方法
Change change = (Change)obj;
change.WriteSomeThing();
//使用方法名,调用方法
MethodInfo mi = type.GetMethod("WriteSomeThing");
object s2 = mi.Invoke(obj,null);
}Top
25 楼winapp(木偶笨笨)回复于 2004-02-18 17:10:27 得分 0
好强哦!Top
26 楼soulroom(易水之风)回复于 2004-02-18 17:37:46 得分 0
try it
Type t = typeof(System.Data.SqlClient.SqlDataAdapter);
Top
27 楼winapp(木偶笨笨)回复于 2004-02-19 10:58:45 得分 0
用Type、MethodInfo可以取得类信息和方法信息,可是我还是不明白怎么实现动态调用。
因为不明白方法的参数信息ParameterInfo[]怎么动态使用。虽然MethodInfo可以取得参数信息,但是怎么用呢?调用者是不知道参数类型的,知道的最多是参数个数,它可以提供参数,很可能全部用string类型的。我该怎么根据MethodInfo.GetParameters()取得的参数信息把STRING类型的参数全部转换成所需参数啊?如果我不能转换,动态调用岂不是一句空话?Top
28 楼qqchen79(知秋一叶)回复于 2004-02-20 01:47:51 得分 0
MethodInfo.GetParameters返回的ParameterInfo包含了ParameterType。
如果你要“完全”动态的调用的话,可以用Activator.CreateInstance建立符合参数类型的对象作为参数。Top
29 楼xixigongzhu(夕夕公主(※快乐在于自己※))回复于 2004-02-23 10:04:35 得分 0
并不是所有的类型都可以从string转换而来,一般实现了接口IConvertible的类都可以。
可以用Convert.ChangeType(obj, paramType);