反射主要使用的命名空间:

System.Reflection
System.Type
System.Reflection.Assembly

本质:元数据

反射的本质其实是使用元数据;元数据其实就是程序编译出来的特定数据结构的表;当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等;用过c++的可能会类比一下头文件;

反射的作用就是解析使用这些元数据;上面的几个命名空间就是实现这些解析与使用。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Practice.NET.Reflact
{
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; } public Product()
{ } public Product(string name, decimal price)
{
this.Name = name;
this.Price = price; } public void PrintName()
{
Console.WriteLine(this.Name);
} void PrintPrice()
{
Console.WriteLine(this.Price.ToString());
} public string GetName(string name)
{
this.Name = name;
return this.Name; }
public void GetName()
{
PrintName();
} public void ShowPrice(ref decimal price)
{
this.Price = price; }
}
}

Product

using System;
using System.Reflection; namespace Practice.NET.Reflact
{
public class ReflactTest
{
/// <summary>
/// 基本用法
/// </summary>
public void Test()
{
//1、-------------------------程序集------------------------
string path = AppDomain.CurrentDomain.BaseDirectory + "Practice.NET.exe";//;
Assembly ass = Assembly.LoadFrom(path); //2、--------------------------类-------------------- //第一种方法,在类的构造函数是无参时使用方便,在有参时就不容易实现 object obj1 = ass.CreateInstance("Practice.NET.Reflact.Product");//实例化Person类,返回值是object,通过命名空间及类名得到
Type myType1 = obj1.GetType(); //得到类的类型 //第二种方法,通过获得类型的构造函数来实例化对象,在构造函数是有参时也容易实现 Type myType2 = ass.GetType("Practice.NET.Reflact.Product");//得到类的类型 ConstructorInfo constructor = myType2.GetConstructor(new Type[]);//得到myType的构造函数(无参) object instance2 = constructor.Invoke(null);//调用构造函数来实现实例化类现在先通过调用无参构造函数来实例化类,下面看一下通过反射怎么得到类成员: //3、--------------------方法------------------------- MethodInfo method1 = myType2.GetMethod("PrintName");//得到无参公有方法 MethodInfo method2 = myType2.GetMethod("PrintPrice", BindingFlags.Instance | BindingFlags.NonPublic);//得到私有方法 MethodInfo method3 = myType2.GetMethod("GetName", new Type[] { typeof(string) });//得到带参数的公有方法(后面的Type类型可以省略,但如果是重载方法就不能省) MethodInfo method4 = myType2.GetMethod("GetName", new Type[]); MethodInfo method5 = myType2.GetMethod("ShowPrice");//得到参数是ref的的方法 //4、-----------------------------属性------------------
//得到属性
PropertyInfo[] propertys = myType2.GetProperties(BindingFlags.Instance | BindingFlags.Public); PropertyInfo Name = myType2.GetProperty("Name");
PropertyInfo Price = myType2.GetProperty("Price"); FieldInfo name = myType2.GetField("name", BindingFlags.Instance | BindingFlags.NonPublic);//得到字段(全是私有的)
FieldInfo age = myType2.GetField("name", BindingFlags.Instance | BindingFlags.NonPublic); //设置/读取属性
Name.SetValue(instance2, "李四", null);//给Name设值,后面的null是对应的索引器 Price.SetValue(instance2, 23M, null); Name.GetValue(instance2); //5、----------------特性 myParamAttribute--------------
//foreach (var item in propertys)
//{
//item.GetCustomAttributes(typeof(myAttribute), true).Length //返回item包含myAttribute特性的数组 //} //6、----------------调用方法------------ method1.Invoke(instance2, null); method2.Invoke(instance2, null); Console.WriteLine(method3.Invoke(instance2, new object[] { "王五" }));//调用有返回值的方法 method4.Invoke(instance2, null); method5.Invoke(instance2, new object[] { 14M });//调用参数是ref的方法
}
}
}

ReflactTest

.NET拾忆:反射的本质——元数据的更多相关文章

  1. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

  2. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

  3. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  4. .Net拾忆:从List去除重复-拾忆集合

    方法1: private static List<int> DistinctList(List<int> list) {//去除重复 HashSet<int> ha ...

  5. JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

    /**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建aut ...

  6. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  7. 利用反射及JDBC元数据编写通用查询方法

    元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...

  8. 利用反射及jdbc元数据实现通用的查询方法

    ---------------------------------------------------------------------------------------------------- ...

  9. MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

    1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...

随机推荐

  1. xiv存储操作

    XIV存储操作维护手册                       二○一二年七月 目录 1.      存储划分... 3 1.1.       定义Storage Pool 3 1.2.      ...

  2. 洛谷P1086 花生采摘【模拟】

    题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...

  3. 阿里云不同账号之间相同地域的VPC网络互访

    今天实际操作了一下,在这篇随笔中记录一下以备忘,主要参考阿里云帮助文档-不同账号下专有网络内网互通. 实现场景:账号A的VPC网络中的ECS访问账号B的VPC网络中的ECS与RDS(地域都在华东1), ...

  4. Luogu 1603 - 斯诺登的密码 - [简单字符串操作]

    题目链接:https://www.luogu.org/problemnew/show/P1603 题目背景 根据斯诺登事件出的一道水题 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混 ...

  5. [No0000DA]WPF ControlTemplate简介

    一.简介 WPF包含数据模板和控件模板,其中控件模板又包括ControlTemplate和ItemsPanelTemplate,这里讨论一下ControlTemplate.其实WPF的每一个控件都有一 ...

  6. samba速度调优

    本来windows上传到板子上的速度很慢 增加 socket options = TCP_NODELAY 明显上传下载速度都快了 参考: https://superuser.com/questions ...

  7. 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则

    #include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,& ...

  8. inotifywait实现目录监控--http://man.linuxde.net/inotifywait

    sudo apt install inotify-tools while inotifywait -q -r -e create,delete,modify,move,attrib --exclude ...

  9. jquery-- json字符串没有自动包装为 json对象

    jquery 的一个坑 页面使用 ajax ,回调函数中获取后端返回的 json 格式数据(ajax 未显式指定返回值类型),后端controller方法标注 @ResponseBody 并返回一个 ...

  10. 转:Web项目的WEB-INF目录使用说明以及重定向与转发

    原文地址:https://www.cnblogs.com/shenxiaoquan/p/5819359.html 原文内容: 总结一下这篇文章的内容: WEB-INF下面的内容都是只能由服务器级别才能 ...