反射的用途大体总结:
1、使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从程序集中查找类型并创建该类型的实例。CreateInstance
2、使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其它特定的非全局方法。
3、使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。
4、使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstratc或virtual)等。
5、使用FieldInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
6、使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
7、使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
8、使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
System.Reflection
System.Type
System.Reflection.Assembly

反射用到的主要类
System.Type类--通过这个类可以访问任何给定数据类型的信息
System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。

System.Type类
System.Type类 对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息

获取给定类型的Type引用有3中常用方式:
1、使用typeof运算符
Type t = typeof(string);
2、使用对象GetType()方法
sring s = "lslsl";
Type t = s.GetType();
3、还可以使用Type类的静态方法GetType()
Type t = Type.GetType("System.String");
在取出Type引用t后我们就可以通过t来探测string类型的结构了

string n = "";
Type t = n.GetType();
foreach(MemberInfo mi in t.GetMembers())
{
Console.WriteLine("{0}/{1}",mi.MemberType,mi.Name);
}

Type类的属性
Name数据类型名
FullName数据类型的完全限定名(包括命名空间名)
Namespace定义数据类型的命名空间名
IsAbstract 是否是抽象类型
IsArray 是否是数组
IsClass 是否是类
IsEnum 是否是枚举
IsPublic 是否是public
IsSealed 是否是密封类
IsValueType 是否是值类型

Type类的方法
GetConstructor(),GetConstructors()返回ConstructorInfo类型,用于取得该类的构造函数的信息
GetEvent(),GetEvents() 返回EventInfo类型,用于取得该类的事件的信息
GetField(),GetFields() 返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
GetInterface(), GetInterfaces() 返回InterfaceInfo类型,用于取得该类实现的接口信息
GetMember(), GetMembers() 返回MemberInfo类型,用于取得该类的所有成员信息
GetMethod(),GetMethods() 返回MethodInfo类型,用于取得该类的方法的信息
GetProterty(),GetProperties() 返回PropertyInfo类型,用于取得该类的属性的信息
可以调用这些成员,方式是调用Type的InvokeMember()方法,或者调用MemberInfo,PropertyInfo和其它类的Invoke()方法。

System.Reflection.Assembly介绍
Assenbly类可以获得程序集的信息,也可以动态的加载程序集,以及在程序集中查找类型信息,并创建该类型的实例。

使用Assembly类可以降低程序集之间的耦合,有利于软件结构的合理化
通过程序集名称返回Assembly对象
Assembly ass = Assembly.Load("ClassLibrary111");
通过Dll文件名称返回Assembly对象
Assembly ass = Assembly.LoadFrom("ClassLibrary111.dll");
通过Assembly获取程序集类
Type t = ass.GetType("ClassLibrary111.NewClass");//参数必须是类的全名
通过Assembly获取程序集的所有类
Type[] t = ass.GetTypes();//通过程序集的名称反射
Assembly ass = Assembly.Load("ClassLibrary11");
Type t = ass.GetType("ClassLibrary111.NewClass");
object o = Activator.CreateInstance(t, "mantishell", "https://www.baidu.com");
MethodInfo mi = t.GetMethod("Show");
mi.Invoke(o, null);
//通过Dll文件全名反射其中的所有类型
Assembly assembly = Assembly.LoadFrom("xxx.dll的路径");
Type[] types = assembly.GetTypes();
foreach(Type t in types){
if(t.FullName == "a.b.c"){
object o = Activator.CreateInstance(t);
}
}

System.Reflection.Assembly使用
假设要反射一个dll中的类,并且没有引用它(即未知的类型),我们可以像下面操作
Assembly assembly = Assembly.LoadFile("程序集的绝对路径“);//exe或dll
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

反射当前项目的中的类
Assembly assembly = Assembly.GetExecutingAssembly();//获取当前程序集
object obj = assembly.CreateInstance("Reflection.MainClass");
((MainClass)obj).Show();
其中Reflection.MainClass是命名空间+类名的形式

代码:

一个person类和一个包含main方法的myApp类

 namespace myApp{
public class Person{
public string str;
public int num; private string index; public string Name{get;set;}
public int Age{get;set;}
public string Index { get => index; set => index = value; } public Person(){
System.Console.WriteLine("No Parameter Constructor");
} public Person(string str, int num){
this.str = str;
this.num = num;
System.Console.WriteLine("Have Some Parameter Constructor");
} public void Show(){
System.Console.WriteLine("Show , name:{0}, Age:{1}", this.Name, this.Age);
}
}
}
 using System;
using System.Reflection; namespace myApp
{
class Program
{
static void Main(string[] args)
{
Type t = typeof(Person); #region 获取
/*System.Console.WriteLine("P:{0}", t);//命名空间贾类名 //获取类中的所有公有字段
FieldInfo[] fis = t.GetFields();
foreach(var item in fis){
System.Console.WriteLine(item);
}
//获取类中所有的属性
PropertyInfo[] pis = t.GetProperties();
foreach(var item in pis){
System.Console.WriteLine(item);
}
//构造函数
ConstructorInfo[] cis = t.GetConstructors();
foreach(var item in cis){
System.Console.WriteLine(item);
//构造函数的参数列表
ParameterInfo[] pis2 = item.GetParameters();
foreach(var item2 in pis2){
System.Console.WriteLine(item2);
}
} //方法,包括继承的方法
MethodInfo[] mt = t.GetMethods();
foreach(var item in mt){
System.Console.WriteLine(item);
}*/ #endregion #region 使用构造函数创建实例 //用构造函数创建一个实例
/*Type[] paramType = new Type[2];
paramType[0] = typeof(string);
paramType[1] = typeof(int); //根据指定的参数,获取对应的构造函数
ConstructorInfo ci = t.GetConstructor(paramType);
object[] obj = new Object[] {"Hello", 123};//传递的参数
object person = ci.Invoke(obj);
((Person)person).Show();//调用方法
*/
#endregion #region 使用Activator创建实例 /*object[] obj = new object[]{"Hello", 1};
object person = Activator.CreateInstance(t);//无参构造方法
((Person)person).Show(); object person2 = Activator.CreateInstance(t, obj);
((Person)person).Name = "ddd";
((Person)person).Show(); object person3 = Activator.CreateInstance(t, "Hello", 11);
((Person)person).Show();
*/ #endregion #region 使用 Person person = new Person();
t = person.GetType(); object obj = Activator.CreateInstance(t); FieldInfo f = t.GetField("str");//根据字段名获取字段
f.SetValue(obj, "Hello");//字段赋值 FieldInfo f2 = t.GetField("num");
f2.SetValue(obj, ); System.Console.WriteLine(f.GetValue(obj)); PropertyInfo p1 = t.GetProperty("Name");//获取属性
p1.SetValue(obj, "Jimmy", null);//赋值 PropertyInfo p2 = t.GetProperty("Age");
p2.SetValue(obj, , null);
System.Console.WriteLine(p2.GetValue(obj)); //方法
MethodInfo mi = t.GetMethod("Show");
mi.Invoke(obj, null); #endregion
}
}
}

c# 关于反射的更多相关文章

  1. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  2. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  3. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  6. .NET面试题系列[6] - 反射

    反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...

  7. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  8. C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射

    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...

  9. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  10. SI与EMI(一) - 反射是怎样影响EMI

    Mark为期两天的EMC培训中大概分成四个时间差不多的部分,简单来说分别是SI.PI.回流.屏蔽.而在信号完整性的书籍中,也会把信号完整性分为:1.信号自身传输的问题(反射,损耗):2.信号与信号之间 ...

随机推荐

  1. mybatis解决字段名和实体属性不相同

    两种方法: 1.在xml文件里面使用别名 2.使用resultMap标签

  2. WindowsServer --------- 在服务器中安装sqlserver 数据库

    数据库文件可能比较大可以通过盘符映射来进行传递,就是时间比较慢 方法,上一片就是介绍如何进行传递    点击这个连接 安装sqlserver 2014 数据库 要是没有密钥可以试试这个 一般  .Ne ...

  3. 管道的原子性 linux写操作原子性

    从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的 ...

  4. 如何在 ubuntu 下使用 Windows 里面的字体

    01. 02. 03. 04. 谢谢浏览!

  5. Redis(四)Pub/Sub

    发布与订阅 Pub/Sub模式应该非常熟悉,在现实应用中被广泛的使用.如:微博中关注某个号,这个号有发新博时,关注的都会收到:github上watch了某个项目,当有issue时,就会发邮件. Red ...

  6. mini QQ(项目一)

    一个多人聊天工具(C/S结构),实现了如下功能: 一个可视化窗口,支持鼠标点击事件 注册功能,用户可以注册自己的聊天账号, 注册信息包括: 账号名(可以用姓名来替代账号,支持中文), 密码(聊天框输入 ...

  7. Exceptionless - 本地搭建

    搭建环境:Windows 10 参与文档:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting 运行环境: .NET 4.6 ...

  8. 【原创】闲来无事,用Winform写了个简易浏览器

    核心是利用了winform自带的WebBrowser控件,修改了下IE内核的版本,目前还是单线程的,逻辑挺简单的,萌新都能看懂. 废话不多说,上代码,附打包project. 链接:https://pa ...

  9. 关于.Net Core 前后端分离跨域请求时 ajax并发请求导致部分无法通过验证解决办法。

    项目中有这样一个页面.页面加载的时候会同时并发6个ajax请求去后端请求下拉框. 这样会导致每次都有1~2个“浏览器预请求”不通过. 浏览器为什么会自动发送“预请求”?请看以面连接 https://b ...

  10. PIE SDK加载WMS服务数据

    1.   功能简介 WMS服务,WMS是OGC标准中比较简单也是比较重要的标准之一.它全称是“Web Map Service”(网络地图服务):利用具有地理空间位置信息的数据制作地图.其中将地图定义为 ...