反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型

(包括类、结构、委托、接口和枚举等)的成员和成员的信息。

其实有些人会问, 像我们平常引用DLL可以直接用, 为什么要用反射?反射还是对性能有影响的,

尽管可以通过优化反射的行为缩小之间性能的差距,可能这个时候对于性能要求毫秒级的需求, 那就要适当的取舍是否用反射。

(尽管对于大部分定制软件开发来说, 软件都是一次开发, 然后二次维护, 很少大的需求面会更改)。

反射最大的好处就是, 插件化, 动态可配置, 扩展性强。当面临需求的变更亦或新增模块的情况,不用去改动源代码。

1.利用Assembly去加载DLL程序集

利用微软现有的结局方案可以实现动态加载Dll程序集, 在System.Reflection命名空间下的Assemly。

1.新建一个控制台应用程序

2.新建一个类库ClassLibrary, 新建两个模型 一个Student类 , 一个School类

 public class Student
{
public string name { get; set; } public string sex = ""; public void Hay()
{
Console.WriteLine("你们好");
} public void Hay(string name)
{
Console.WriteLine(name + "你好");
} public void GoodBye<T>(T name)
{
Console.WriteLine(name + "再见");
} private void GoodBye()
{
Console.WriteLine("再见");
} public static void StaticMethod()
{
Console.WriteLine("私有方法...");
}
}
 public class School
{
}

3.将ClassLibary放在控制台的根目录, 用于测试。  (完整如下)

//利用Assembly.Load方法读取外部的DLL程序集 【默认加载根目录下面DLL】

 //反射加载外部DLL
Assembly ass = Assembly.Load("ClassLibrary"); //默认加载根目录下面DLL

//获取程序的Modules

//获取所有模块
foreach (var item in ass.GetModules())
{
Console.WriteLine(item.FullyQualifiedName);
}

//获取属性, 方法, 字段

 foreach (var item in ass.GetTypes()) //
{
Console.WriteLine(item.FullName); //获取DLL中所有的命名空间 foreach (var sub in item.GetProperties()) //公开属性
{
Console.WriteLine(item.Name + "公开属性:" + sub.Name);
}
foreach (var sub in item.GetMethods()) //公开方法
{
Console.WriteLine(item.Name + "公开方法:" + sub.Name);
}
foreach (var sub in item.GetFields()) //公开字段
{
Console.WriteLine(item.Name + "公开字段:" + sub.Name);
}
}

//反射创建实例对象

foreach (var item in ass.GetTypes())
{
if (item.Name.Contains("Student")) //ClassLibrary.Student
{
//使用Activator 动态去创建一个实例对象, 调用其中的公开方法
Student stu = (Student)Activator.CreateInstance(item);
stu.Hay();
}
}

//反射调用实例方法、静态方法、重载方法、私有方法、泛型方法

  foreach (var item in ass.GetTypes())
{
if (item.Name.Contains("Student"))
{
//Student实例对象
object obj = Activator.CreateInstance(item); //实例方法
MethodInfo method = item.GetMethod("Hay", new Type[] { });
method.Invoke(obj, null); //重载方法
MethodInfo method1 = item.GetMethod("Hay", new Type[] { typeof(string) }); //带参数Hay
method1.Invoke(obj, new object[] { "哥哥" }); //静态方法
MethodInfo method2 = item.GetMethod("StaticMethod");
method2.Invoke(null, null); //私有方法
MethodInfo method3 = item.GetMethod("GoodBye", BindingFlags.Instance | BindingFlags.NonPublic);
method3.Invoke(obj, null); //泛型方法
MethodInfo method4 = item.GetMethod("GoodBye");
method4 = method4.MakeGenericMethod(typeof(string)); //重点,为泛型声明指定类型
method4.Invoke(obj, new object[] { "泛型," }); }
}

//反射字段属性: GetValue SetValue

foreach (var item in ass.GetTypes())
{
if (item.Name.Contains("Student"))
{
object obj = Activator.CreateInstance(item); foreach (var sub in item.GetProperties())
{
sub.SetValue(obj, "Mobike"); //SetValue
Console.WriteLine(sub.GetValue(obj)); //GetValue
}
}
}

C# 反射基础运用的更多相关文章

  1. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  2. 【转】Java反射 之 反射基础

    一.反射 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  3. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  4. java反射基础知识(四)反射应用实践

    反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...

  5. java反射基础知识(一)

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

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

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

  7. C#学习笔记----反射基础

    反射基础 反射用于在程序运行过程中,获取类里面的信息或发现程序集并运行的一个过程.通过反射可以获得.dll和.exe后缀的程序集里面的信息.使用反射可以看到一个程序集内部的类,接口,字段,属性,方法, ...

  8. C#反射与特性(一):反射基础

    目录 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 2. 程序集操作 2.1 获取 程序集对象(Assembly) 2.2 Assembly 使用 2.3 获取程序集的方式 C# ...

  9. Java的反射基础技术

    今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段. ...

  10. java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)

    当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象 当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那 ...

随机推荐

  1. Linux能ping通IP,ping不通域名

    今天碰到个问题, 能ping通IP地址, ping不通域名, 一直以为是 DNS解析服务器的问题, 找了半天. 问题不在这里. [root@www postfix]# cat /etc/resolv. ...

  2. vue22 路由

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 打包,VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程

    转载收藏于 https://www.cnblogs.com/xinaixia/p/5473815.html 从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而 ...

  4. 外部数据库驱动程序XX中的意外错误

    链接EXCEL打开报错 代码如下(Excel2003版本)出现这种错误 现在只需要更改 修改成 并且把导入版本修改

  5. nodejs操作文件和数据流

    前言 node中有一组流api,它们可以像处理网络流一样处理文件.流api用起来非常方便,本节学习介绍文件处理基础和流的概念. 目录 处理文件路径 fs核心模块简介 操作流 慢客户端问题 1. 处理文 ...

  6. 参考分享《Python深度学习》高清中文版pdf+高清英文版pdf+源代码

    学习深度学习时,我想<Python深度学习>应该是大多数机器学习爱好者必读的书.书最大的优点是框架性,能提供一个"整体视角",在脑中建立一个完整的地图,知道哪些常用哪些 ...

  7. EditPlus,UltraEdit等编辑器列选择的方法

    在使用富文本编辑器的时候,通常模式是行选择状态,由于今天想使用EditPlus列选择状态, 于是通过在网上收集的资料,总结出相关富文本编辑器的列选择的方法. EditPlus  1)菜单:编辑 -&g ...

  8. 洛谷 P1732 [TJOI2011]序列

    P1732 [TJOI2011]序列 题目描述 一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中: 求\sum\limits^n_{i=1} b_ ...

  9. Redisclient连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

    工作须要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外仅仅提供一个接口. 2.屏蔽上层应用对连接的细节处理: 3.底层採用队列的方式保持连接池,保存连接会话. 4.重连时採用时间 ...

  10. [BZOJ3526][Poi2014]Card 线段树

    链接 题意:有一些卡牌,正反各有一个数,你可以任意翻转,每次操作会将两张卡牌的位置调换,你需要在每次操作后回答以现在的卡牌顺序能否通过反转形成一个单调不降的序列 题解 线段树上维护 \(f[o][0/ ...