你的位置:首页 > ASP.net教程

[ASP.net教程]使用反射、特性简化代码


假设现在有一个学生类(Student)

  /// <summary>  /// 学生类  /// </summary>  public class Student  {      /// <summary>    /// 名字    /// </summary>    private string name;    public string Name    {      get { return name; }      set { name = value; }    }    /// <summary>    /// 年龄    /// </summary>    public int Age { get; set; }    /// <summary>    /// 地址    /// </summary>    public string Address { get; set; }    /// <summary>    /// 性别    /// </summary>    public string Sex;  }

如果需要判断某些字段(属性)是否为空,是否大于0,便有以下代码:

    public static string ValidateStudent(Student student)    {      StringBuilder validateMessage = new StringBuilder();      if (string.IsNullOrEmpty(student.Name))      {        validateMessage.Append("名字不能为空");      }      if (string.IsNullOrEmpty(student.Sex))      {        validateMessage.Append("性别不能为空");      }      if (student.Age <= 0)      {        validateMessage.Append("年龄必填大于0");      }      //...... 几百行      // 写到这里发现不对啊,如果必填项有20多个,难道我要一直这样写吗!      return validateMessage.ToString();    }

这样的代码,重用性不高,而且效率低。

我们可以用特性,反射,然后遍历属性并检查特性。

首先自定义一个【必填】特性类,继承自Attribute

  /// <summary>  /// 【必填】特性,继承自Attribute  /// </summary>  public sealed class RequireAttribute : Attribute  {    private bool isRequire;    public bool IsRequire    {      get { return isRequire; }    }    /// <summary>    /// 构造函数    /// </summary>    /// <param name="isRequire"></param>    public RequireAttribute(bool isRequire)    {      this.isRequire = isRequire;    }  }

然后用这个自定义的特性标记学生类的成员属性:

  /// <summary>  /// 学生类  /// </summary>  public class Student  {      /// <summary>    /// 名字    /// </summary>    private string name;    [Require(true)]    public string Name    {      get { return name; }      set { name = value; }    }    /// <summary>    /// 年龄    /// </summary>    [Require(true)]    public int Age { get; set; }    /// <summary>    /// 地址    /// </summary>    [Require(false)]    public string Address { get; set; }    /// <summary>    /// 性别    /// </summary>    [Require(true)]     public string Sex;  }

通过特性检查类的属性:

    /// <summary>    /// 检查方法,支持泛型    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="instance"></param>    /// <returns></returns>    public static string CheckRequire<T>(T instance)    {      var validateMsg = new StringBuilder();      //获取T类的属性      Type t = typeof (T);      var propertyInfos = t.GetProperties();      //遍历属性      foreach (var propertyInfo in propertyInfos)      {        //检查属性是否标记了特性        RequireAttribute attribute = (RequireAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof (RequireAttribute));        //没标记,直接跳过        if (attribute == null)        {          continue;        }        //获取属性的数据类型        var type = propertyInfo.PropertyType.ToString().ToLower();        //获取该属性的值        var value = propertyInfo.GetValue(instance);        if (type.Contains("system.string"))        {          if (string.IsNullOrEmpty((string) value) && attribute.IsRequire)            validateMsg.Append(propertyInfo.Name).Append("不能为空").Append(",");        }        else if (type.Contains("system.int"))        {          if ((int) value == 0 && attribute.IsRequire)            validateMsg.Append(propertyInfo.Name).Append("必须大于0").Append(",");        }      }      return validateMsg.ToString();    }

执行验证:

    static void Main(string[] args)    {      var obj = new Student()      {        Name = ""      };      Console.WriteLine(CheckRequire(obj));      Console.Read();    }

结果输出:

有人会发现,Sex也标记了[Require(true)],为什么没有验证信息,这是因为,Sex没有实现属性{ get; set; },GetProperties是获取不到的。

 




英国旅游去哪好英国旅游团报价优惠英国蜜月旅游行程参考英国特价旅游多少钱到英国游费用报价大全美景美食:8个理由令你让上菲律宾(全文) 日本惊现痔疮神殿 专治痔疮香客火爆 《京城81号》上映 夜探北京第一凶宅(全文) 池州石门高 千年古村落的前世今生(组图) 重庆有什么好玩的地方? 香港迪斯尼乐园的门票是多少? 领略全球十大游客量最多的国家 全球25座城市最优惠订房时间表(图) 去香港玩暑假期间哪个时段比较合适? 香港迪士尼有哪些娱乐项目? 香港到澳门的船票最便宜多少钱?要多长时间? 九寨沟一年四季景色是怎样的?九寨沟旅游攻略 兔屎茶“解酒?各国闻所未闻的奇葩解酒法(全文) 40415 海南欢乐节去玩吗?第15届海南欢乐节优惠景点有哪些? 40416 海南欢乐节有什么好玩的?第十五届海南欢乐节节目介绍? 40417 “新世界7大奇观城市”出炉 黎巴嫩首都居首(全文) 40418 看奇幻魔界 听野人传说 40419 2015南京冰雪奇缘圣诞主题展举办时间、地点、门票以及活动详情怎么样? 40420 禁止使用硬币购物?世界八国最奇葩规定(全文) 40421 海南欢乐节有什么活动?2015海南欢乐节活动介绍? 4042 “融和粤菜”取之于自然,食之于丽轩[三] 2015百万葵园冬天有什么好玩的?广州番禺百万葵园几时去最好? 江门哪里有梅花节?江门赏梅花哪里好? AT83C24NDS-TISUL Datasheet AT83C24NDS-TISUL Datasheet AT83C24NDS-TISUM Datasheet AT83C24NDS-TISUM Datasheet AT83C24-TISIL Datasheet AT83C24-TISIL Datasheet 深圳周边旅游景点 深圳周边旅游景点 深圳周边旅游景点 鼓浪屿旅游攻略2013 鼓浪屿旅游攻略2013 鼓浪屿旅游攻略2013 四川乐山大佛门票 四川乐山大佛门票 四川乐山大佛门票