一、反射是什么

  1. 反射就是.Net FrameWork框架为我们提供的一个帮助类库,它可以读取我们通过编译后生成的dll和exe文件里面metadate的信息。
  2. 反射可以动态的加载dll和exe文件,动态的创建对象,动态的调用方法,动态的获取属性的值和为属性赋值等等......

二、通过反射获取信息

在C#程序中,我们可以用 System.Reflection 命名空间下的 Assembly 类来加载dll文件,从而来获取里面的信息,代码如下:

                    Assembly assembly = Assembly.Load("MyReflection.DB.SqlService");
foreach (var item in assembly.GetModules())
{
Console.WriteLine("Module完全限定名:" + item.FullyQualifiedName);
}
foreach (var type in assembly.GetTypes())//遍历该dll下的所有类型
{
Console.WriteLine("Type完全限定名:" + type.FullName);
foreach (var item in type.GetConstructors())//遍历类型下的所有构造函数
{
Console.WriteLine(item.Name);
}
foreach (var item in type.GetMethods())//遍历类型下的所有公开方法
{
Console.WriteLine(item.Name);
}
foreach (var item in type.GetProperties())//遍历类型下的所有公开属性
{
Console.WriteLine(item.Name);
}
foreach (var item in type.GetFields())//遍历类型下的所有公开字段
{
Console.WriteLine(item.Name);
}
}

三、创建对象

上面我们可以获取到dll中的信息,接下来我们就来使用一些信息来创建对象,来调用对象里的方法。

                        Assembly assembly = Assembly.Load("MyReflection.DB.SqlService");//1.动态加载dll
Type typeHelper = assembly.GetType("MyReflection.DB.SqlService.SqlServerHelper");//2.获取类型信息
object objDbHelper = Activator.CreateInstance(typeHelper);//3.创建对象
IDBHelper dbHelper = (IDBHelper)objDbHelper;
dbHelper.Query();

四、调用方法

通过上面我们知道要想调用方法,就必须先知道类型,然后强转成相应的类型才能调用方法,接下来我们就来实现不需要知道类型就来调用一系列方法:

首先上面创建对象的三个步骤是少不了的。

     Assembly assembly = Assembly.Load("MyReflection.DB.SqlService");//1.动态加载dll
Type typeHelper = assembly.GetType("MyReflection.DB.SqlService.ReflectionTest");//2.获取类型信息
object objDbHelper = Activator.CreateInstance(typeHelper);//3.创建对象

1、调用无参数的方法:

        public void show1()
{
Console.WriteLine("这里是{0}的show1", this.GetType());
} MethodInfo show1 = typeHelper.GetMethod("show1");
show1.Invoke(objDbHelper, null);

结果如下:

2、调用有参数的方法:

        public void show2(int id)
{
Console.WriteLine("这里是{0}的show2", this.GetType());
}
MethodInfo show2 = typeHelper.GetMethod("show2");
show2.Invoke(objDbHelper, new object[] { });

结果如下:

3、调用有参数并且重载的方法:

     public void show3()
{
Console.WriteLine("这里是{0}无参的show3", this.GetType());
}
public void show3(string name,int id)
{
Console.WriteLine("这里是{0}带string参数和int参数的show3", this.GetType());
}
public void show3(int id,string name)
{
Console.WriteLine("这里是{0}带int参数和string参数的show3", this.GetType());
}
public void show3(int id)
{
Console.WriteLine("这里是{0}带int参数的show3", this.GetType());
}
public void show3(string name)
{
Console.WriteLine("这里是{0}带string参数的show3", this.GetType());
} MethodInfo show3_1 = typeHelper.GetMethod("show3", new Type[] { typeof(string) });
show3_1.Invoke(objDbHelper, new object[] { "dafs" }); MethodInfo show3_2 = typeHelper.GetMethod("show3", new Type[] { typeof(int) });
show3_2.Invoke(objDbHelper, new object[] { }); MethodInfo show3_3 = typeHelper.GetMethod("show3", new Type[] { typeof(int), typeof(string) });
show3_3.Invoke(objDbHelper, new object[] { , "dfafsd" });

结果如下:

4、调用有私有的方法:

        private void show4(string name)
{
Console.WriteLine("这里是{0}的show4", this.GetType());
}
MethodInfo show4 = typeHelper.GetMethod("show4", BindingFlags.Instance |//访问私有方法
BindingFlags.Public | BindingFlags.NonPublic);
show4.Invoke(objDbHelper, new object[] { "dfafsd" });

结果如下:

4、调用静态的方法:静态方法在调用的时候要不要对象都行,推荐不要放对象,原因就不说了,都懂的

        public static void show5(string name)
{
Console.WriteLine("这里是{0}的show5", typeof(ReflectionTest));
}
MethodInfo show5 = typeHelper.GetMethod("show5");//静态方法
show5.Invoke(null, new object[] { "dfafsd" });//不放对象
show5.Invoke(objDbHelper, new object[] { "dfafsd" });//放对象

结果如下:

五、为属性赋值和设置值

接直来我们创建一个 People 类

    public class People
{
public int Id { get; set; }
public string Name { get; set; }
}

然后实例化:

                    People people = new People
{
Id = ,
Name = "张三"
};

接下来我们来获取属性值和设置属性值:

                    Type type = typeof(People);
object oPeople = Activator.CreateInstance(type);
foreach (var item in type.GetProperties())//字段设置和获取的语法和属性一样
{
Console.WriteLine("{0}={1}", item.Name, item.GetValue(oPeople));
if (item.Name.Equals("Id"))
{
item.SetValue(oPeople, );
}
if (item.Name.Equals("Name"))
{
item.SetValue(oPeople, "李四");
}
}

结果如下:

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. [Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)

    使用Xamarin開發Android APP時, 如果已經有原本就用Java寫好的套件(.jar), 就可以利用Xamarin提供的Java Bindings Libary將他變成C#可使用的元件. ...

  2. hibernate_Session接口_load_get

    hibernate读取数据库内容,用 1,session.get(Class类型,主键); 立马发出sql语句.从数据库中取出值装到对象里去 2,session.load(Class类型,主键); 从 ...

  3. 用idea搭建一个简单的SSM的Demo

    1.新建一个maven  web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...

  4. 实现基于NTP协议的网络校时功能

    无论PC端还是移动端系统都自带时间同步功能,基于的都是NTP协议,这里使用C#来实现基于NTP协议的网络校时功能(也就是实现时间同步). 1.NTP原理 NTP[Network Time Protoc ...

  5. NetXray

    NetXRay是由Cinco Networks公司开发的一个用于高级分组检错的软件,功能很强大.IP地址查询工具. 硬件要求 对硬件要求低,可运行常用的windows平台. 主要功能 1.监视网络状态 ...

  6. laravel5.4学习--laravel基本路由

    最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此提供一个非常简单且优雅的定义路由方法: Route::get('foo', function () {return 'Hello W ...

  7. java 基础 --- volatile

    问题  : volatile 解决的是什么问题 有什么应用场景 概述 某些共享变量的时候我们使用volatile 修饰,它会保证修改的值立即被更新到主存,或是从主存中获取最新的值.它的底层是如何实现的 ...

  8. 二、curator入门

    简介 curator是Apache下开源的项目,它包含了zookeeper的客户端高层级API的实现,并提供了一些常见的用例实现方便我们直接使用.简单来说,使用curator作为zookeeper客户 ...

  9. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  10. 撩课-Python-每天5道面试题-第6天

    一. 函数的概念是什么? 在Python中如何定义?使用场景是什么? 概念 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就 ...