.NET拾忆:反射的本质——元数据
反射主要使用的命名空间:
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拾忆:反射的本质——元数据的更多相关文章
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- .Net拾忆:从List去除重复-拾忆集合
方法1: private static List<int> DistinctList(List<int> list) {//去除重复 HashSet<int> ha ...
- JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法
/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建aut ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- 利用反射及JDBC元数据编写通用查询方法
元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...
- 利用反射及jdbc元数据实现通用的查询方法
---------------------------------------------------------------------------------------------------- ...
- MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询
1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...
随机推荐
- .NET Core开发日志——Startup
一个典型的ASP.NET Core应用程序会包含Program与Startup两个文件.Program类中有应用程序的入口方法Main,其中的处理逻辑通常是创建一个WebHostBuilder,再生成 ...
- Codeforces 219C - Color Stripe - [DP]
题目链接:http://codeforces.com/problemset/problem/219/C 题意: 给你 $n$ 个方块排成水平一排,每个方块都涂上 $k$ 种颜色中的一种.要求对尽量少的 ...
- 相对定位和绝对定位 left和margin-left
1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会以最近一个定位的父对象为参考点,.margin-left则不用设positi ...
- SQL行列转换6种方法
在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...
- Exactly-Once 投递语义
小结: 1.Exactly-Once 是指发送到消息系统的消息只能被消费端处理且仅处理一次,即使生产端重试消息发送导致某消息重复投递,该消息也在消费端也只被消费一次. 消息队列 RocketMQ &g ...
- wfp(Application的运用)
1.Application中封装了wpf的一些常用的功能,如检查未经处理的异常,处理命令行参数等. 2.如何启动wpf程序: app.xaml可用于启动wpf的窗体.也可以不用这用方式.直接创建一个a ...
- Django 的操作
安装: pip install Django 创建django工程 django-admin startproject mysite python manage.py startapp blog / ...
- [dpdk] service core
dpdk 17.11 增加了一组新的API,serivce core 如命名,就是用一组core跑service函数. 我自己的测试程序如下: https://github.com/tony-caot ...
- [administrative][archlinux][netctl][wpa_supplicant] 查看WIFI链接信息
当使用 netctl + wpa_supplicant的时候,环境里同时存在好多个WIFI,而我同时有配置了他们的密钥信息在配置文件中. 那么我该如何查看,我当前链接到了哪个WIFI上? /home/ ...
- knowledge learning things TODO
加密分区 suricata调研 tor配置 tilda配置 automake / autoconf / libtool 使用 大页内存的深入原理 Memory channels Network Man ...