如何使用反射

如何使用反射

楼主hustzxs(泰) 2003-09-01 14:34:50 在 .NET技术 / C# 提问

在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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值