C#
shanzm



简介

反射(reflection)是什么?

在《精通C#》中是这么说的“反射就是一个运行库发现的过程”。

举例来说,通过反射,可以得到一个给定的.dll或.exe程序集所包含的所有类型的列表,这个列表包括给定类型定义的方法、字段、属性和事件。



引入

1.新建类库

右键解决方案->添加->新建项目->选择"类库"

在类库项目中添加几个自定义的类(在《C#入门经典》中发现新建类可以使用VS中自带的类图添加,但是我感觉不是很方便,但是不得不承认VS的查看类图,对阅读项目代码还是很有帮助的)

右键类库项目点击生成,在项目的bin\DeBug文件夹中生成相应的程序集文件(dll格式).

2. 类库的使用

如果某个项目要使用某个类库,则我们在项目中添加引用,引用类库项目,并添加引用的项目的命名空间。这样就可以使用类库中定义的类了。

3.反射

对于程序集文件(dll和exe文件),他们是二进制文件,不能直接打开,但是我们想要查看里面的具体内容,我们该怎么办。

使用VS中的“对象浏览器”,直接右击引用文件,我们可以选择在对象浏览器中查看,就可以看到类库文件(dll文件)中的定义的类。

还有一种方法那就是使用VS自带的反编译工具ildasm.exe(C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\ildasm.exe)

但是在代码中怎么查看呢,这就要用到反射。

这就是动态加载程序集



反射实例1

在这里,我们把ClassLibrary1类库文件(dll文件)复制到项目的bin/Debug文件中

ClassLibrary1类库有三个类具体如下

代码如下:

namespace _01程序集的引用
{
class Program
{
static void Main(string[] args)
{
#region 加载程序集
//获取基目录(也就是bin\deBug的绝对路径)
string deBuyPath = AppDomain.CurrentDomain.BaseDirectory; //获取DeBug中的dll文件的绝对路径(通过类库项目生成的,我自己复制到那里的)
//using System.IO;
string dllPath = Path.Combine(deBuyPath, "ClassLibrary1.dll"); //加载程序集文件(using System.Reflection;)
Assembly ass = Assembly.LoadFile(dllPath);
#endregion Console.WriteLine("获取程序集中所有定义的类的类名,包括internal和public");
Type[] allTypes = ass.GetTypes();
foreach (Type item in allTypes)
{
Console.WriteLine($"程序集ClassLibrary1.dll中有类:{item.Name }");
} //获取程序集中指定的类的类型
Type p = ass.GetType("ClassLibrary1.Person");
Console.WriteLine($"获取指定的类,类名{p.Name},类的命名空间{p.Namespace}"); //获取所有程序集dll文件中定义的公共类型的类型(公共类)
Type[] publicTypes = ass.GetExportedTypes(); Console.ReadKey(); }
}
}

运行结果:

-----------获取程序集中所有定义的类的类名,包括internal和public---------

程序集ClassLibrary1.dll中有类:Person

程序集ClassLibrary1.dll中有类:Student

程序集ClassLibrary1.dll中有类:Teacher

-----------获取程序集中指定的类的类型---------

获取指定的类,类名Person,类的命名空间ClassLibrary1

-----------获取程序集中公共类---------

程序集ClassLibrary1.dll中的公共类有:Person

程序集ClassLibrary1.dll中的公共类有:Student



反射实例2

namespace _02程序集的引用2
{
class Program
{
static void Main(string[] args)
{
//查询变量的类型 //法1:已经声明了一个变量
string str = "abcd";
Type t1 = str.GetType();
Console.WriteLine(t1); //法2:直接使用变量类型查询
Type t2 = typeof(string);
Console.WriteLine(t2); //法3:直接使用Type.GetType()静态方法
Type t3 = Type.GetType("System.String");
Console.WriteLine(t3); //我们可以获得string的类型名,我们可以使用类型对象来探测string类型的内部结构
foreach (MemberInfo item in t1.GetMembers ())
{
Console.WriteLine($"当前类型的公共成员类型{item.MemberType},成员名{item.Name }");
} Console.ReadKey(); }
}
}



反射实例3

反射实例1中我们知道了类库中的各个成员的的类型,那么我们怎么才能新建一个该类型的对象呢(这就是晚期加载

注意啊,上面我们只是获得了各个类的类型(类名),并没有真正的获得这个类名这个变量

所以我们无法使用类名这个变量去new一个对象

建立程序集中类的对象


//建立程序集中类的对象
object person = Activator.CreateInstance(p, 24, "志铭", "男"); #region 获取类型的属性
//获取该对象的属性列表
Console.WriteLine("--------获取该对象的属性列表---------");
PropertyInfo[] pros = person.GetType().GetProperties();
foreach (PropertyInfo item in pros)
{
Console.WriteLine(item.Name);
} //获得指定名称的属性
PropertyInfo pro = p.GetProperty("Name");
//获得对象person的指定的属性的值
string name = (string)pro.GetValue(person, null);
Console.WriteLine(name);
#endregion #region 获取类型的方法列表
Console.WriteLine("-------获取类型的方法列表--------------");
MethodInfo[] methods = person.GetType().GetMethods();
foreach (MethodInfo item in methods)
{
Console.WriteLine(item.Name);
} //调用指定名称的方法
MethodInfo method = person.GetType().GetMethod("Say");
method.Invoke(person, null);
#endregion //获取字段列表(注意你只能获取公共类型的字段)
FieldInfo[] fields = person.GetType().GetFields();
foreach (FieldInfo item in fields)
{
Console.WriteLine(item.Name);
} Console.ReadKey();

C#-反射reflection的更多相关文章

  1. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  2. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  3. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  4. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  5. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  6. Golang 反射reflection

    反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...

  7. C# 反射(Reflection)技术

    本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly).模块(Module).类型 ...

  8. C#反射(Reflection)详解

    1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...

  9. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  10. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

随机推荐

  1. SpringIOC原理简述

    IOC:控制反转(Inversion of Control,英文缩写为 IOC) 简单来讲就是把代码的控制权从调用方(用户)转变成被调用方(服务端) 以前的代码控制权在调用方,所以要每当程序要更新修改 ...

  2. Ntaub表单开发入门系列 (一)

    此系列文章通过虚构场景介绍Ntaub表格开发流程.示例假设某公司人力部门要制定招聘计划,要求各部门按月提交招聘需求,招聘需求需经人力总监和公司总经理审批. 软件可以从http://www.ntaub. ...

  3. 你在为谁工作——IT帮深圳分站2019年3月线下活动回顾

    对于工作,在每个人的心中,它所占的份量都是不一样的.有的人活着是为了工作,有的人工作是为了更好的生活. 在3月24日下午,北京.上海与深圳三地我们同步举办了关于工作这个话题的沙龙活动. 我们深圳分站参 ...

  4. sdk和api的区别

    SDK SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”.这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档.范例和工具的集合都可以叫做 ...

  5. 空间数据可视化之ArcLayer详解

    deck-overlay中 首先使用d3中的scaleQuantile将数据进行分类,scaleQuantile方法是d3中的一种数据分类方法(https://www.cnblogs.com/kids ...

  6. Git让你从入门到精通,看这一篇就够了!

    简介 Git 是什么? Git 是一个开源的分布式版本控制系统. 什么是版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 什么是分布式版本控制系统? 介绍分布 ...

  7. Android 开发学习资源汇总

    下面这些资源对Android开发来说是很有帮助的! 1. 在线代码运行工具 地址:https://tool.lu/coderunner/ 说明:此工具站能在线运行C.C++.Java,基本能满足相关基 ...

  8. SUSE12SP3-Mycat(2)Schema.xml配置详解

    简介 Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库.表.分片规则.DataNode 以及 DataSource.弄懂这些配置,是正确使用 MyCat 的前 ...

  9. 腾讯云服务器搭建Apache/PHP/MySQL环境

    软件环境 Windows Server 2008 R2 企业版 SP1 64位 刚刚进入 Windows Server ,你会看到以下界面: 列出了服务器的基础信息和常用配置 下载 XAMPP htt ...

  10. Google File System 见解 (作业)

    Google File System ——见解 近年来,大街小巷都传遍的大数据,引起了社会的一阵学习大数据狂热,造成任何公司在招聘人员的时候都会注上一条,会大数据的优先考虑:但是,从另一方面来说,这狂 ...