反射这个词听起来就很牛逼是吧?

嗯的确,反射是比较高级的特性,只有语言基础很扎实的Dev们才应该使用它。

搞点反射,可以提高程序的灵活性、可扩展性、耦合度。

反射这东西,是为了动态地运行时加载,相比于静态代码。编译的时候就是板上钉钉了。

就是说,如果你的程序需要在运行时搞一些晚绑定,动态加载或检查对象之类的操作时,那么反射欢迎你。

说到这,也许有人立刻就去找反射相关的文档和教程,想赶紧把反射技术实践到程序上。

给爷爪巴

使用反射是要分场合的

反射基本上是一种解释操作,用于字段啊方法啊接入时要远慢于直接撸代码。

因此反射机制主要应用在对灵活性和拓展性要求很高的东西上,普通程序不建议使用。

还有一件事,如果你程序全用的反射。一时反射一时爽,后期维护秒跑路。

程序员最烦的2件事是什么,维护没有注释的代码和写注释。但当程序员看到代码有一大堆的反射而且没写注释的时候,他们会直接/kill @p就完事了。

因为 反 射 绕 过 了 源 代 码 的 技 术 ,反射代码贼JB复杂,相比普通的来说

BCL声明了一个Type类型(它是抽象类),用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型的信息。

由于Type是抽象类,所以它不能被实例化。而是在运行时,CLR创建从Type(RuntimeType)派生的类型的实例。当我们要访问这些实例的时候,CLR不会返回派生类的引用而是返回Type基类的引用。

关于Type有如下重要的点:

①对于程序每一个需要用到的类型,CLR会穿件一个包含这个类型信息的Type类型的对象(真实的是上面说的派生的类型的实例)。

②程序中用到的每一个类型都会关联到独立的Type类的对两个象。

③无论创建的类型有多少个实例,只有一个Type对象会关联到所有这些实例。就像下面的图表示的一样。创建了一个OtherClass的实例oc、以及两个MyClass的实例mc1和mc2,但是在堆上都只会有一个Type对象来的对应他们,如下面的图示:

现在我们知道,object类型包含了一个GetType方法,它可以用来返回事例的Type对象引用。由于所有的类都是继承自object类型,所以所有的类都可以调用GetType来获得Type类型对象的引用。

所以下面的代码,在遍历派生类的Field的时候才能,把基类的也输出出来。

//鸡肋
class BaseClass
{
public int BaseField = ;
} //派生类
class DerivedClass : BaseClass
{
public int DerivedField = ;
} class Program
{
static void Main(string[] args)
{
var bc = new BaseClass();
var dc = new DerivedClass();
BaseClass[] bca = new BaseClass[] { bc, dc };
foreach(var v in bca)
{
//获取类型
Type t = v.GetType();
Console.WriteLine("Object Type: {0}", t.Name);
//获取类中的字段
FieldInfo[] fi = t.GetFields();
foreach (var f in fi)
Console.WriteLine(" Field:{0}", f.Name);
Console.WriteLine();
}
Console.WriteLine("End!");
Console.ReadKey();
}
}

方法二:通过typeof()方法来获取一个类型的Type对象引用。例如下面的代码:

1
Type t = typeof(DerivedClass);
//通过程序集获取类型
var baseType = Assembly.GetExecutingAssembly().GetType("TestDemo.BaseClass");
var derivedType = Assembly.GetExecutingAssembly().GetType("TestDemo.DerivedClass");

  

很好,来个常用的骚操作。结合GetType和typeof操作,可以做很多事情....

static void Main(string[] args)
{
var intArray = typeof(int).MakeArrayType();
var int3Array = typeof(int).MakeArrayType(); Console.WriteLine($"是否是int 数组 intArray == typeof(int[]) :{intArray == typeof(int[]) }");
Console.WriteLine($"是否是int 3维数组 intArray3 == typeof(int[]) :{int3Array == typeof(int[]) }");
Console.WriteLine($"是否是int 3维数组 intArray3 == typeof(int[,,]):{int3Array == typeof(int[,,]) }"); //数组元素的类型
Type elementType = intArray.GetElementType();
Type elementType2 = int3Array.GetElementType(); Console.WriteLine($"{intArray}类型元素类型:{elementType }");
Console.WriteLine($"{int3Array}类型元素类型:{elementType2 }"); //获取数组的维数
var rank = int3Array.GetArrayRank();
Console.WriteLine($"{int3Array}类型维数:{rank }");
Console.ReadKey();
}

未完待续...

所以下面的代码,在遍历派生类的Field的时候才能,把基类的也输出出来。

最新文章

  1. register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动
  2. 取代奶瓶Minidwep-gtk破解WPA 全攻略
  3. JS调用WebService
  4. 《数据结构与算法JavaScript描述》
  5. [转]使用maven镜像
  6. JS预览图像
  7. matlab 在代码中,显示错误,退出程序
  8. CentOS6.5安装配置Samba
  9. poi大数据将excel2007导入数据库
  10. 解决ios上微信无法捕获返回键按钮事件的问题
  11. 创建GIF loading图片
  12. Java对象比较器对泛型List进行排序-Demo
  13. SQL truncate 、delete与drop区别
  14. 学学简单的-------------javaScript基础
  15. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
  16. 「SDOI 2018」战略游戏
  17. 用户不在 sudoers 文件中,此事将被报告
  18. create-react-app 知识点
  19. es-06-java创建mapping和setting
  20. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

热门文章

  1. K8S生产环境中实践高可靠的配置和技巧都有哪些?
  2. 【模板】普通平衡树(权值splay)
  3. Ganglia安装及配置
  4. DirectX11 With Windows SDK--29 计算着色器:内存模型、线程同步;实现顺序无关透明度(OIT)
  5. 用Java实现一个简单的DBMS(总结)
  6. ubuntu-14.04.6配置IP
  7. SpringBoot学习(1) - 日志
  8. Spring-cloud微服务实战【八】:API网关zuul
  9. Redis系列(三):Redis的持久化机制(RDB、AOF)
  10. CInternetSession的简单使用