c# 反射时GetType方法查找Type的分析

反射是高级语言里面很强大的一种机制。C#也给我们提供了强大的反射机制。反射使用起来非常简单,最常见的步骤是:

1,定义一个Type 对象, Type myType;

2,通过字符串或者其它流初始化该对象,MyType = Type.GetType("MyClass");

在Type.GetType()方法执行时,系统怎么根据字符串查找正确的类的定义呢?看下面代码

[c-sharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.IO;
  5. namespace Test{
  6. public delegate Object TwoInt32s(Int32 n1, Int32 n2);
  7. public delegate Object OneString(String s1);
  8. class App
  9. {
  10. public static void Main(String[] args)
  11. {
  12. //Type delType = Type.GetType("TwoInt32s");//错误的调用方法
  13. Type delType = Type.GetType("Test.OneString");//正确的调用方法
  14. if (delType == null)
  15. {
  16. Console.WriteLine("Invalid delType argument: " + "TwoInt32s");
  17. return;
  18. }
  19. }
  20. }
  21. }

这段代码说明Type.GetType在解析类型的时候如果参数字符串没有指定namespace将会导致程序不能正确解析类型。

如果我们把namespace去掉,得到下面的代码

[c-sharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.IO;
  5. public delegate Object TwoInt32s(Int32 n1, Int32 n2);
  6. public delegate Object OneString(String s1);
  7. class App
  8. {
  9. public static void Main(String[] args)
  10. {
  11. Type delType;
  12. delType = Type.GetType("System.IO.File");//正确方法
  13. //delType = Type.GetType("File");//错误
  14. delType = Type.GetType("TwoInt32s");//正确的调用方法
  15. //Type delType = Type.GetType("Test.OneString");
  16. if (delType == null)
  17. {
  18. Console.WriteLine("Invalid delType argument: " + "TwoInt32s");
  19. return;
  20. }
  21. }
  22. }

这说明如果某类型被包含在namspace里面就必须要用包含namespace的完整路径来获取类型信息。

时间: 2024-10-10 23:29:19

c# 反射时GetType方法查找Type的分析的相关文章

C#- 反射之 GetType()方法

Type.GetType()在跨程序集反射时返回null的解决方法 在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如

iOS APP启动时所有方法的调用顺序分析

一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问题.本文不怕麻烦的在几乎所有启动时要调用的方法里都用了 __FUNCTION__ 打印.结果还有有些地方出人意料的 首先回顾一下应用程序的启动过程 ①.先加载Main函数 ②.在Main函数里的 UIApplicationMain方法中,创建Application对象 创建Application的D

对应用程序启动时所有方法的调用顺序分析

一个应用程序的启动过程要包括代理的创建,控制器的加载和控制器view的加载,这其中有很多关于生命周期的方法,每个方法都是有先后顺序的,如果调用顺序拿不准,或者某段代码写的方法不恰当,就会遇到各种奇葩问题.本文不怕麻烦的在几乎所有启动时要调用的方法里都用了 __FUNCTION__ 打印.结果还有有些地方出人意料的 如果你不是在董铂然博客园看到本文,请点击查看原文 首先回顾一下应用程序的启动过程 ①.先加载Main函数 ②.在Main函数里的 UIApplicationMain方法中,创建Appl

ruby中的方法查找

ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicObject类).这期间经历过的路径就是祖先链. 1混含模块和继承的方法查找 对于一个实例对象,先找它属于的类中是否有对应的实例方法,然后看这个类中是否有模块,如果有,查找模块中是否有对应的方法,如果没有,则查找父类.先看父类的实例方法,再看父类中是否有模块,再看父类的父类..一直到最后,BasicO

Type.GetType()在跨程序集反射时返回null的解决方法

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 1 Type supType = typeof(BNameSpace

【百度地图API】当地址解析失败时,如何调用search方法查找地址

原文:[百度地图API]当地址解析失败时,如何调用search方法查找地址 有个朋友问我,当地址解析失败时,应该如何处理呢?比如,他想搜索“南宁市青秀区”. ----------------------------------------------------------------------------- 首先,我们需要弄明白,地址解析的原理: 使用Geocoder进行地址解析,比如“北京市海淀区上地10街”,当系统匹配到这个地址时,getPoint就会返回一个坐标点.这里需要用到回调函数

VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决

S2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选项卡,将“启用Visual Studio宿主进程“一项钩掉. 原文地址:https://www.cnblogs.com/gisoracle/p/9690123.html

C#中的反射和扩展方法的运用

前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 DataTable 中的数据封装到 Models 中.结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了 DataTable和 DataRow的扩展方法, 下面是代码: using System; using System.Collectio

反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

创建Delegate (1).Delegate.CreateDelegate(Type, MethodInfo) : 创建指定类型的静态方法, 1.Type(委托类型) 2.MethodInfo(要创建的静态方法的信息,通过类的type.GetMethod( funcName , BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.Public )获取) 3.例:typeof(string).GetMethod(“Equals