zoukankan      html  css  js  c++  java
  • .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(" 属性名:{0} 对应值 :{1} 属性显示名称:{2},", name, value, des);                }
       }

    获得的对应信息显示为下图

    加载中...

     

    反射创建对象

    反射的用途除了获取对象对应的信息,还可以动态创建对象,调用对象的方法<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+u7nKx7jVssW1xMDgo6zM7bzT0ru49r6yzKy3vbeoPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"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。

    小结:

    反射的使用有时候可以很大程度上减少代码量,复用率也是有所提高的,并且灵活度也是很好的,但是有时候避免不了效率的问题。这个还是需要看情况的。以上的两点为常用的方法,尤其为通过名称调用方法或属性。这里抛砖引玉,欢迎大家指点。

  • 相关阅读:
    js截取字符串区分汉字字母代码
    List 去处自定义重复对象方法
    63. Unique Paths II
    62. Unique Paths
    388. Longest Absolute File Path
    41. First Missing Positive
    140. Word Break II
    139. Word Break
    239. Sliding Window Maximum
    5. Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/gc2013/p/4150302.html
Copyright © 2011-2022 走看看