反射和特征
.net framework供应的反射和特征手艺,能够用来搜检数据反复性,以决议是不是向数据库表中写入某条数据。
需求
某个实体向数据库写入一条数据时,许多时刻,须要搜检这条数据是不是是一条反复数据,比方新建的职员,假定ID号码不能反复,此时新建的这个职员ID号与职员表中的一条或多条反复了,此时须要给出提醒或采用其他手腕,比方更新,或删除等。
要领
在这类需求场景下,能够运用.net framework供应的特征与反射手艺,处置惩罚此类需求。细致历程,
其次,在实体类中援用刚写好的特征类组织出其唯一标识(一个或多个属性组合);
末了,搜检数据反复性时,运用Attribute供应的要领,猎取每一个实体类的唯一性标识属性(一个或多个)。
Attribute[] GetCustomAttributes(modeltype, inherit);
KeyFieldAttribute 特征类
public class KeyFieldAttribute:Attribute { private static List<string> keyfields = new List<string>(); /// <summary> /// 组织症结属性 /// </summary> /// <param name="fields"></param> public KeyFieldAttribute(params string[] fields) { foreach (string kf in fields) { if (!keyfields.Contains(kf)) keyfields.Add(kf); } } public static List<string> KeyFields { get { return keyfields; } } }
实体类Model
[KeyField("ID")]public class Person { public int ID {get;set;} //职员ID public string Name {get;set;}//职员称号 public DateTime BirthDate {get;set;} //诞生年月日} [KeyField("RoleGroupID","RoleCode")] public class Role { public int RoleGroupID { get; set; } //角色组别ID public string RoleCode { get; set; } //角色编号 public string RoleName { get; set; }//角色称号 }
注重特征扩大类,此处是KeyFieldAttribute中的后缀Attribute是能够省略的,因而KeyField是简写,相当于KeyFieldAttribute。
运用特征类:
KeyFieldAttribute.GetCustomAttributes(typeof(Person), true); List<string> fields = KeyFieldAttribute.KeyFields; //猎取到Person实体的唯一标识属性ID KeyFieldAttribute.GetCustomAttributes(typeof(Role), true); var fields = KeyFieldAttribute.KeyFields;//Role实体唯一属性,2个属性组合:RoleGroupID,RoleCode
运用特征返回的症结属性组合,在数据库中查询数据,假如能查到最少一条纪录,则根据肯定的逻辑处置惩罚; 假如不能,则能够直接写入新数据。Attribute类中供应的要领申明:
/// <summary>/// 检索运用于范例的成员的自定义特征的数组。/// </summary> /// <param name="modeltype">要搜刮的自定义特征的范例</param> ///<param name="inherit">是不是搜刮成员的先人</param> /// <returns>自定义特征的数组</returns>Attribute[] GetCustomAttributes(modeltype, inherit);
以上就是.NET框架-运用特征和反射搜检数据唯一性的示例代码的细致内容,更多请关注ki4网别的相干文章!