zoukankan      html  css  js  c++  java
  • 反射例子

    一:反射

    运行过程中动态操作类型

    二:得到反射对象方法

    1.typeof(类型名)

    2.对象名.GetType()

    三:例题

    在数据库中有个户型(HuXing),类型int ,但是在网页上显示每个数字必须代表特定的中文意义。。

    int 中文代表意思

    1 一室一厅

    2 一室二厅

    3 两室两厅

    4 三室一厅

    5 别墅

    如果我们写判断条件,当HuXing=1时,输出 一室一厅,为2时输出一室二厅,这样效率低,如果有多处需要相同的效果,就会重复写很多代码。如果有一天想把1代表写成三室两厅,那么很多地方就会跟着一起改变,很繁琐。。

    现在我们只希望有一个地方改变其他地方就会自动跟着一起改变就好,那么就会用到反射。。

    (1)建一个类,这个类中是枚举类型的(枚举可以转换成数字,并且他是有限的,特定的),OneRoomOneSaloon,OneRoomTwoSaloon......就是(2)属性中的Name ,一室一厅,一室两厅...就是(2)属性中的Descript ,1,2,3,4...就是(2)属性中的Key

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Model
    {
    public enum EnumHourseHuxing
    {
    [Description ("一室一厅")] //特征,在网页效果上想要显示的文字
    OneRoomOneSaloon=1, //为什么不直接写“一室一厅=1”,因为在后面这个将会成为一个字段,但 //是字段不能以数字开头,如果有一天我们先要显示出“1室1厅”,那么就 //会报错,不易修改。。
    [Description("一室两厅")]
    OneRoomTwoSaloon=2,
    [Description("两室一厅")]
    TwoRoomOneSaloon=3,
    [Description("两室两厅")]
    TwoRoomTwoSaloon=4,
    [Description("三室一厅")]
    ThreenRoomOneSaloon=5,
    [Description("别墅")]
    Villadom=6
    }


    }
    }

    (2)另一个页面,创建相应的字段。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;

    namespace Model
    {

    /// <summary>
    /// 显示枚举所代表的值
    /// </summary>
    public class EnumHelper
    {
    public string Name { get; set; }//
    public int Key { get; set; }
    public string Descript { get; set; }

    ///传入一个反射类型

    public static List<EnumHelper> GetEnumDataHerper(Type t)
    {
    List<EnumHelper> all = new List<EnumHelper>();
    var pis = t.GetFields();//得到枚举中的字段集合,是一个集合
    foreach (var item in pis)
    {
    if (!item.IsSpecialName)//不要枚举中多余的项,
    {
    object[] os = item.GetCustomAttributes(false);//属性的特征,是一个集合,一个属性会有多个特征
    var descript = "";
    //
    foreach (var o in os)
    {
    if (o is DescriptionAttribute) //按照(1)应该写特征(o is Description )但是这里要全称 //DescriptionAttribute
    {
    var a = o as DescriptionAttribute;//向下转型
    descript = a.Description;//获取Description值,我们需要的中文显示项
    }
    }

    //创建一个EnumHelper 对象,并赋值
    EnumHelper si = new EnumHelper
    {
    Name=item.Name,
    Descript=descript,//给特征赋值
    Key=Convert.ToInt32(item.GetRawConstantValue())//枚举每项关联的值

    };
    all.Add(si);//将对象加入到集合中去
    }


    }
    return all;
    }


    /// <summary>
    /// 通过传入反射对象,和一个数字,得到对应的单个EnumHelper 对象,我们可以通过 “.属性”的方法

    /////得到他的属性值

    /// </summary>
    /// <param name="t"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public static EnumHelper GetOneEnumByName(Type t, int value)
    {
    var eds = GetEnumDataHerper(t);
    foreach (var item in eds)
    {
    if (item.Key == value)
    {
    return item;//如果有对应的值,就返回代表这个数字的EnumHelper 对象
    }
    }
    return null;//如果没有对应的值,就返回null
    }
    }
    }

    (3)如何使用GetEnumDataHerper(Type t)方法;

    我们需要找到传入的Type t;

    var t=typeof(EnumHourseHuxing);

    var allhuxing=Model.EnumHelper.GetEnumDataHerper(t);

    //循环获取自己想要的数据

    foreach (var item in allhuxing)
    {
    Response.Write(item.Name);
    Response.Write(item.Descript);
    Response.Write(item.Key);
    }

    (4)GetOneEnumByName(Type t, int value)方法的使用

    var t=typeof(EnumHourseHuxing);

    value=1;//自己赋值

    Var OneEnumHelper =GetOneEnumByName(t, value);

    //以下就是得到这个对象的一些属性值
    //OneEnumHelper.Key;
    //OneEnumHelper.Descript;
    //OneEnumHelper.Name

    文中写的两个方法,都可以自己整理成一个程序集,以后遇见同样的问题直接使用就可以了。。

  • 相关阅读:
    C# 反射修改私有静态成员变量
    symfony2 controller
    symfony2 路由工作原理及配置
    symfony2 安装并创建第一个页面
    git操作命令
    Node异步I/O、事件驱动与高性能服务器
    nodejs get/request
    nodejs events模块
    nodejs 小爬虫
    nodejs API
  • 原文地址:https://www.cnblogs.com/yaoxiaodan/p/5030805.html
Copyright © 2011-2022 走看看