不知道大家有过这样类似的编码

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类的更多相关文章

  1. 反射+type类+Assembly+特性

    什么是元数据,什么是反射: 程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据. 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程 ...

  2. C# - 系统类 - Type类

    Type类 ns:System Type类封装类型 它的实例提供一个特定类型的数据和函数成员的信息 可以使用Type类实例来调用类型的成员 一般将Type类用于反射 Type类的静态字段如下 Empt ...

  3. 反射,System.Type类

    http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到 ...

  4. 反射 介绍System.Type类

    本节先介绍system.Type类,通过这个类可以访问关于任何数据类型的信息. 1. system.Type类以前把Type看作一个类,但它实际上是一个抽象的基类.只要实例化了一个Type对象,实际上 ...

  5. C# 反射和Type类

    一.元数据和反射 1.1 定义 大多数程序都要处理数据,包括读.写.操作和显示数据.然而,对于某些程序来说,它们操作的不是数字.文本或图形,而是程序和程序类型本身的信息. ● 有关程序及其类型的数据被 ...

  6. [javaSE] 反射-Class类的使用

    JAVA-Reflect 专题 ①Class类的使用 ②方法的反射 ③成员变量的反射 ④构造函数的反射 ⑤java类的加载机制 Ⅰ在面向对象的世界里,万事万物皆为对象 类是对象,类是java.lang ...

  7. 反射工具类——ReflectUtils

    测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...

  8. java反射工具类

    package com.yingchao.kgou.core; import java.lang.reflect.Field; import java.lang.reflect.InvocationT ...

  9. c#通过反射获取类上的自定义特性

    c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...

随机推荐

  1. CSS3组件化之圆波扩散

    本篇文章主要介绍用CSS3实现的水波扩散涟漪,圆波扩散,光圈扩散,雷达波向外散发动画. 预期效果应该是这样:,其实应该比这个更优美,因为设计师提供的gif出现透明度丢失问题,所以建议用css3实现. ...

  2. python opencv3 显示一张图片

    git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 """ 显示一张图像 ...

  3. android 定时, 延时 任务

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 倒计时类  用  倒计时定时器CountDownTimer 延迟类 CountDownT ...

  4. [Luogu5106]dkw的lcm

    https://minamoto.blog.luogu.org/solution-p5106 容易想到枚举质因子及其次数计算其贡献,容斥计算$\varphi(p^i)$的次方数. #include&l ...

  5. 【线性基】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem A. XOR

    题意:给你一些数,问你是否能够将它们划分成两个集合,使得这两个集合的异或和之差的绝对值最小. 设所有数的异或和为S,集合A的异或和为A. 首先,S的0的位对答案不造成影响. S的最高位1,所对应的A的 ...

  6. java集合之一(框架介绍)

    本文转载自:http://www.cnblogs.com/skywang12345/p/3308498.html Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(It ...

  7. 协议栈中使用crc校验函数

    CRC校验介绍:循环冗余校验码,原理是多项式除法 ZigBee协议栈:能够使zigbee节点相互之间组网,数据传输,数据获取,数据显示 思路以及步骤: 1.因为IAR的程序是用c写的,所以上网查找如何 ...

  8. bzoj 5055: 膜法师 -- 树状数组

    5055: 膜法师 Time Limit: 10 Sec  Memory Limit: 128 MB Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇 ...

  9. pygame系列_pygame的各模块叙述

    在pygame中,有很多模块,每个模块对应着不同的功能,如果我们知道这些模块是做什么的,那么,对我们的游戏开发会起到关键性的作用. 我们就说说pygame中的各个模块吧!!! #pygame modu ...

  10. android 内部存储 安装apk

    在做应用自动更新模块下载apk时遇到了内部存储和sd卡存储两种情况,存在sk卡中存储apk可以正常安装,可是在内部存储中安装apk时出现了parse error的问题. 在网上搜了搜,大致分为两种方案 ...