反射提供了封装程序集、模块和类型的对象(Type类型)

可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 。

总之,有了反射,以前很多实现不了的功能都可以实现。

下面先来写一个小例子,体验一下反射是怎么一回事:

打开VS2010,新建一个控制台应用程序,在program.cs里面写代码

首先引入命名空间:

using System.Reflection;

下如下代码:

         PropertyInfo len = typeof(string).GetProperty("Length");string s = "Hello,reflection!";int length = (int)len.GetValue(s, null);Console.WriteLine(length.ToString());

这里通过反射获取string的Length属性,并通过调用PropertyInfo 的GetValues方法获取属性值,其中GetValues方法的原型如下:

public virtual object GetValue(object obj, object[] index);

第一个参数obj是拥有此属性的类的实例,在这个例子中,为字符串s,s拥有Length属性。

第二个参数为索引值,微软解释如下:

Optional index values for indexed properties. This value should be null for non-indexed properties.

一般情况下用null,大家可以自己深入研究一下。

GetValues方法返回的是object类型,所以必须强制转换类型。

下面通过反射来获取string的一个方法,看看方法是如何通过反射得到的,代码如下:

string s = "Hello,reflection!";
MethodInfo method = typeof(string).GetMethod("Contains");
bool result = (bool)method.Invoke(s, new object[] { "Hello" });
Console.WriteLine(result);

其中,Invoke的方法定义如下:

public object Invoke(object obj, object[] parameters);

这个就很好理解了,第一个参数为拥有此方法的类的实例,还是为string实例s.

第二个参数就是一个object数组的参数。

这里调用的是string中的Contains方法,判断string中是否包含某个字符串。

下面通过反射来实例化一个string对象,代码如下:

     Type t = Type.GetType("System.String");char[] para = new char[] { 'H', 'e', 'l', 'l', 'o' };var o = Activator.CreateInstance(t, para);Console.WriteLine(o);

这个跟获取方法相似,唯一不同的就是string的构造方法参数是char[]数组,所以必须传入符合的类型。这里实例化了一个string,值为Hello。

看到这里,你对反射已经有了初步的了解,下面开始进入实战应用:

在解决方案上面点击鼠标右键,添加项目,选中类库,输入名称,添加一个类库。

在类库中添加Custom类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ReflectionDll
{public class Custom {public string Name { get; set; }public string Address { get;set; }public int Age { get; set; }public DateTime BirthDay { get; set; }public string GetInfo(string name = "",int age = 0){if (name == "" && age == 0){return "Custom Name: " + this.Name + ",Age: " + this.Age;}else{return "Custom Name: " + name + ",Age: " + age;}}}
}

这里只声明了几个属性和一个方法,供演示使用。写好后编译一下,在控制台项目里面添加引用这个类库(为了方便,否则每次编译都要手动拷贝DLL到控制台项目下面),这样VS会自动将生成的DLL拷贝到控制台debug目录下,方便调用。下面开始使用反射来加载这个DLL,代码如下:

        string path = Environment.CurrentDirectory + "\\ReflectionDll.dll";Assembly assem = Assembly.LoadFile(path);Type customType = assem.GetType("ReflectionDll.Custom");var custom = Activator.CreateInstance(customType);

注意了,这里首先要获取DLL的物理路径,所以上面是否添加引用是无所谓的。有了路径后,通过Assembly的LoadFile方法加载DLL,再获取类的Type,注意GetType方法里面的参数必须为类的全称,及命名空间 + 类名,否则无法找到。

最后一行,创建了一个类的实例,类型为object类型。

下面来获取Custom的所有属性,代码如下:

 PropertyInfo[] propertys = customType.GetProperties();Console.WriteLine("******************************");foreach (PropertyInfo pro in propertys){Console.WriteLine("PropertyName:" + pro.Name + "\n" +"PropertyType:" + pro.PropertyType + "\n" +"ClassName:" + pro.ReflectedType + "\n" +"DLLName:" + pro.Module + "\n");}Console.WriteLine("******************************");

通过调用GetProperties方法获取所有属性,保存到PropertyInfo[]数组中,然后遍历数组输出属性值。

下面是各个属性的含义:

Name                      属性名称

PropertyType          属性数据类型

ReflectedType         所在的类的命名控件 + 类名

Module                  所在的DLL文件名称

设置某个属性的值,方法如下:

     PropertyInfo p = customType.GetProperty("Name");p.SetValue(custom, "CustomName",null);

是不是很容易啊。。。

下面来说一下,调用类的方法,和一些属性。代码如下:

         MethodInfo _method = customType.GetMethod("GetInfo");//显示方法名称Console.WriteLine("Invoke method:" + _method.Name);//显示返回的数据类型Console.WriteLine("Return type:" + _method.ReturnParameter);ParameterInfo[] parameters =  _method.GetParameters();foreach (ParameterInfo pa in parameters){Console.WriteLine(pa.Name + pa.ParameterType + pa.Position + pa.Member);}object[] paras = new object[] { "Jack",24 };Console.WriteLine(_method.Invoke(custom, paras));

同属性一样,参数可以通过GetParameters()来获取,获取的参数信息如下:

Name                参数名称ParameterType       参数数据类型Position            参数的位置Member              输出所有参数

调用有参数的方法时,需要传入参数,New一个object数组,将参数按顺序写入即可。

转载于:https://www.cnblogs.com/fuchongjundream/p/3843596.html

C#反射基础理解1(转)相关推荐

  1. 关于红外调制基础理解

    关于红外调制基础理解 (2011-10-31 20:01:33)转载▼ 标签: 杂谈 分类: 智能协议无线 要是自己做红外遥控器的话应该怎么做?自己定义一个协议或套用现成协议,但是不管什么协议,对于红 ...

  2. java 反射基础 万字详解(Class-Constructor-Method-Field一条龙)

    目录 前言 一.反射及其相关概念 1.什么是反射? 2.反射的用途: ①分析类: ②查看并使用对象: 3.反射的应用场景: 4.类加载器: 类的加载时机: 5.Class对象: 联系: 二.获取Cla ...

  3. # vue.js 之 对vue.js基础理解

    vue.js 之 对vue.js基础理解 Vue构造器 1 . Vue.js是一个构造函数,编程中称之为构造器 2 . 每一个new Vue() 都是一个Vue构造函数的实例,这个过程叫做实例化 3 ...

  4. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  5. 一篇文章弄懂Java反射基础和反射的应用场景

    文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...

  6. java 反射基础知识

    java 反射 基础知识 反射:reflection 反射关键类 java 反射部分应用 反射:reflection 在运行中分析类. 在运行中查看和操作对象. 基于反射自己创建对象. 调用不可以访问 ...

  7. java 反射基础_Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射.反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的 ...

  8. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  9. PCA与2DPCA及2D-2DPCA零基础理解(下)

    有小伙伴催了好久的这篇文章,我也是一拖再拖,PCA与2DPCA及2D-2DPCA零基础理解(上)已经发布了两年了,这几天由于疫情的原因,我专门找出时间来写这篇博文.以前感觉:怎样确定哪张人脸是属于哪个 ...

最新文章

  1. React、Vue、Angular对比 ---- 介绍及优缺点
  2. 理想的教育是从父母自我改变开始
  3. 使用SourceTree拉取代码出现Permission denied (publickey)
  4. oracle先删后建,oracle 建表之前先删除语句
  5. php中文网企业网站,闻名 PHP企业网站系统 weenCompany v5.3.0 简体中文 UTF8
  6. C语言指针与强制类型转换
  7. 什么是重构,什么不是重构
  8. Java多线程之线程通信之生产者消费者阻塞队列版
  9. 01 Spring学习之-事件驱动eventListener
  10. c语言调用自己编译的头文件,写自己的头文件 ——C语言的多文件编译
  11. 架构探险笔记11-与Servlet API解耦
  12. linux fork脚本,shell调度脚本的三种不同方法(fork, exec, source)
  13. Tinker + Bugly + Jenkins 爬坑之路
  14. windows docker 设置镜像源_Windows10下搭建第一个Docker应用(Demo)
  15. Spring Boot+redis存储session,满足集群部署、分布式系统的session共享
  16. python单核运行_python下多核,单核CPU对于并行,并发执行效率的对比-Go语言中文社区...
  17. 关于友情的励志故事------火炉的故事
  18. 亚马逊账号关联因素有哪些?如何防关联?
  19. 开发过程中移动端实现文件下载
  20. C++ operator 简单使用

热门文章

  1. python函数实例解析_python支持返回函数的实例解析
  2. 编译原理last集c语言,编译原理作业集-第七章.doc
  3. layui 折叠面板使用无效问题
  4. mongodb不等于某个值_MongoDB的安装以及基本增删改查命令
  5. java用数组实现随机不重复抽奖
  6. java完全解耦_java-完全解耦
  7. string类的相关知识及部分操作
  8. 关键字typedef、关键字using、auto类型说明符和declytpe类型指示符
  9. dp打开思路4:POJ1189 UVA12511 HDU2845 HBCPC K
  10. 你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用