.NET反射 Type类
不知道大家有过这样类似的编码
|
1
|
Type type=typeof(T);//T是传入的类型 |
这样写已经是在潜意思的使用反射了。不管你是否知道,但是这是事实。
Type是一个抽象类,必须进行实例化,而typeof则是返回这个实例化的对象,正好符合了Type要求,而且Type也提供了访问对象的能力,包括属性,方法,字段等。对应的为FieldInfo,PropertyInfo和MethodInfo,以及MemberInfo。它们的关系为MemberInfo为基类,其他类为继承它。
以上为引子,我们来看一个例子,获取对象的描述信息
Type反射获取属性(描述等)
这里定义一个类【五年的指标】,并添加属性描述Description,使用的是扩展特性类Description。这里不细说。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class FiveYear { /// <summary> /// 指标名称 /// </summary> [Description("指标名称")] public string IndicatorName { get; set; } /// <summary> /// 指标显示名称 /// </summary> [Description("指标显示名称")] public string IndicatorDisplayName { get; set; } /// <summary> /// 第一年指标值 /// </summary> [Description("第一年指标值")] public decimal FirstYearValue { get; set; } /// <summary> /// 第二年指标值 /// </summary> [Description("第二年指标值")] public decimal SecondYearValue { get; set; } /// <summary> /// 第三年指标值 /// </summary> [Description("第三年指标值")] public decimal ThirdYearValue { get; set; } /// <summary> /// 第四年指标值 /// </summary> [Description("第四年指标值")] public decimal ForthYearValue { get; set; } /// <summary> /// 第五年指标值 /// </summary> [Description("第五年指标值")] public decimal FifthYearValue { get; set; } } |
我们通过反射获取它的各个属性名以及描述
首先通过Assembly反射出当前程序集
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Assembly demoAssebly= Assembly.GetExecutingAssembly();Type fiveYears = typeof(FiveYear);//获取当前实例Object fiveyearObject= demoAssebly.CreateInstance(fiveYears.FullName);//创建实例对象PropertyInfo[] properties = fiveyearObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);//获得实例对象公共属性string tStr=string.Empty;tStr += string.Format("类名称 :{0}", fiveYears.Name);foreach (var item in properties){ string name = item.Name; //名称 object value = item.GetValue(obj2, null); //值 string des = ((DescriptionAttribute)Attribute.GetCustomAttribute(item, typeof(DescriptionAttribute))).Description;// 属性值 if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String")) { tStr += string.Format("\n属性名:{0} 对应值 :{1} 属性显示名称:{2},", name, value, des); } } |
获得的对应信息显示为下图

反射创建对象
反射的用途除了获取对象对应的信息,还可以动态创建对象,调用对象的方法<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+u7nKx7jVssW1xMDgo6zM7bzT0ru49r6yzKy3vbeoPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">public static void Add(int x, int y) { int total = x + y; Console.WriteLine(string.Format("【Add】 {0} plus {1} equals to {2}",x,y,total )); }
调用类的方法由两种方式:分别为
Type 1 InvokeMember()
2 GetMethond()
然后根据方法签名找打自己调用的方法
实例代码
|
1
2
3
|
Type fiveYears =typeof(FiveYear);object[] paramters = { 12, 3 };//创建参数fiveYears.InvokeMember(fiveYears.GetMethod("Add").Name,BindingFlags.InvokeMethod, null, fiveYears, paramters); |

public objectInvokeMember(string name, BindingFlags invokeAttr, Binder binder, objecttarget, object[] args);
说明 :
fiveYears.GetMethod("Add").Name获取方法的签名
第三个参数Binder,封装了绑定对象的规则,几乎一直为null,使用内置的DefaultBinder。
小结:
反射的使用有时候可以很大程度上减少代码量,复用率也是有所提高的,并且灵活度也是很好的,但是有时候避免不了效率的问题。这个还是需要看情况的。以上的两点为常用的方法,尤其为通过名称调用方法或属性。这里抛砖引玉,欢迎大家指点。
.NET反射 Type类的更多相关文章
- 反射+type类+Assembly+特性
什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程 ...
- C# - 系统类 - Type类
Type类 ns:System Type类封装类型 它的实例提供一个特定类型的数据和函数成员的信息 可以使用Type类实例来调用类型的成员 一般将Type类用于反射 Type类的静态字段如下 Empt ...
- 反射,System.Type类
http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到 ...
- 反射 介绍System.Type类
本节先介绍system.Type类,通过这个类可以访问关于任何数据类型的信息. 1. system.Type类以前把Type看作一个类,但它实际上是一个抽象的基类.只要实例化了一个Type对象,实际上 ...
- C# 反射和Type类
一.元数据和反射 1.1 定义 大多数程序都要处理数据,包括读.写.操作和显示数据.然而,对于某些程序来说,它们操作的不是数字.文本或图形,而是程序和程序类型本身的信息. ● 有关程序及其类型的数据被 ...
- [javaSE] 反射-Class类的使用
JAVA-Reflect 专题 ①Class类的使用 ②方法的反射 ③成员变量的反射 ④构造函数的反射 ⑤java类的加载机制 Ⅰ在面向对象的世界里,万事万物皆为对象 类是对象,类是java.lang ...
- 反射工具类——ReflectUtils
测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...
- java反射工具类
package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...
- c#通过反射获取类上的自定义特性
c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...
随机推荐
- 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了
Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) E. National Property(2-sat)
E. National Property time limit per test 1 second memory limit per test 512 megabytes input standard ...
- ASP.NET MVC 提高运行速度的几种性能优化方法
主要介绍ASP.NETMVC 应用提速的六种方法,因为没有人喜欢等待,所以介绍几种常用的优化方法. 大家可能会遇到排队等待,遇到红灯要等待,开个网页要等待,等等等. 理所当然,没有人喜欢等待网页慢吞吞 ...
- python opencv3 圆检测
git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 import numpy as np img_ori ...
- MongoDB 进阶
一.MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允 ...
- 【WIN10】使用自己的PageLoader加載Page
源碼下載:http://yunpan.cn/cFwwrT4V5rHIM 访问密码 1b97 在上一篇博客中,我已經說明了為什麼要自己寫一個PageLoader.原因就是,Frame的GoBack只是 ...
- ARC 101 D - Median of Medians
题面在这里! 这种题只能二分答案把qwwq,直接做根本做不了啊... 首先你需要知道如何通过 一个区间<=x的数有多少个 来判断x和这个区间中位数的关系. 很显然当数有至少 [L/2]+1 个( ...
- 让screen帮助你协同工作
Screen是系统管理员手中的一件利器,下面我把它介绍给你,相信你会和我一样,认可这个非常棒的软件 一,什么情况下会用到screen? 比如说,我们在运行一个非常费时间的程序,注意:可能我们是在通 ...
- MAC下安装多版本JDK和切换几种方式
环境: MAC AIR,OS X 10.10,64位 历史: 过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选 ...
- 使用NFS启动Tiny4412开发板根文件系统
1.Ubuntu14.04上搭建NFS服务 1.1.安装NFS服务 $ sudo apt-get install nfs-kernel-server //安装NFS服务 1.2 创建Tiny ...