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

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. Windows的文件类型关联

    在用脚本语言开发时尤其是在windows环境下发现想自动在命令行环境下运行脚本必须要带着相应的解释器的路径才行,不然就会提示无法找到对应的命令,于是乎在<学习Ruby>这本书中对于文件类型 ...

  2. How to add the ApplicationPoolIdentity to a SQL Server Login

    The ApplicationPoolIdentity is a virtual account in Windows that is dynamically generated when the a ...

  3. 将多个图片合并到一个TIF文件里(非 GDAL) 优化版

    不知道为什么,网上对TIF的操作的资料少得可怜,包括CodeProject上都没有找到多少,在网上大多用GDAL,但这个东西,对只想做个合并图片的功能来说,实在是牛刀杀鸡,(9个DLL要带全,相当的恐 ...

  4. python中的一个现象,db.commit和db.commit()

    假设有一个表,有自增字段,在开发环境中(sublime/Liclipse等)执行insert语句时,如果调用db.commit,那么数据库中不会有这条记录,但也不报错,再次插入成功时,自增自段加1. ...

  5. springboot程序无法访问静态资源

    今天开发遇到了一个很奇葩的错误,再spngboot程序成功运行后发现无法访问再resouces/static下的静态资源,通过rul访问总是404,原因最终锁定在某配置类的一个标签上: @Enable ...

  6. 如果是多个 c 代码的源码文件,编译方法如下: $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 与 test2.c 是两个源代码文件。

    如果是多个 c 代码的源码文件,编译方法如下: $ gcc test1.c test2.c -o main.out $ ./main.out test1.c 与 test2.c 是两个源代码文件.

  7. 免费SSL证书Let's Encrypt(certbot)安装使用教程

    免费SSL证书Let's Encrypt(certbot)安装使用教程 https://www.vpser.net/build/letsencrypt-certbot.html

  8. bootstrape学习

    bootstrape学习 已分享到有道上:http://note.youdao.com/share/?id=076fb6314c99c742a79f6fb66b2a58b0&type=note ...

  9. [knowledge][lisp] lisp与AI

    https://blog.youxu.info/2009/08/31/lisp-and-ai-1/ https://blog.youxu.info/2010/02/10/lisp-and-ai-2/

  10. 实验一:Java开发环境的熟悉

    实验一:Java开发环境的熟悉 一.实验一-1 在码云中建立"20165317exp1"的项目. 从git中下载该项目. 在"20165317exp1"目录下建 ...