# .net framework提供的反射和特性技術,可用來檢查資料重複性,決定是否寫入資料庫表中是否寫入某條資料。
某個實體寫入資料庫到資料庫時,很多時候,需要檢查這條資料是不是一條重複數據,例如新建的人員,假定ID號碼不能重複,此時新建的這個人員ID號碼與人員表中的一條或多條重複了,此時需要給出提示或採取其他手段,例如更新,或刪除等。
在這種需求場景下,可以利用.net framework提供的特性與反射技術,解決此類需求。具體過程,
其次,在實體類別中引用剛寫好的特性類別建構出其唯一標識(一個或多個屬性組合);
最後,檢查資料重複性時,運用Attribute提供的方法,取得每個實體類別的唯一性識別屬性(一個或多個)。
Attribute[] GetCustomAttributes(modeltype, inherit);
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; } } }
#KeyFieldAttribute 特性類別
[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.GetCustomAttributes(typeof(Person), true); List<string> fields = KeyFieldAttribute.KeyFields; //获取到Person实体的唯一标识属性ID KeyFieldAttribute.GetCustomAttributes(typeof(Role), true); var fields = KeyFieldAttribute.KeyFields;//Role实体唯一属性,2个属性组合:RoleGroupID,RoleCode
注意特性擴展類,此處是KeyFieldAttribute中的後綴Attribute是可以省略的,因此KeyField是簡寫,相當於KeyFieldAttribute。 運用特性類別:
/// <summary>/// 检索应用于类型的成员的自定义特性的数组。/// </summary> /// <param name="modeltype">要搜索的自定义特性的类型</param> ///<param name="inherit">是否搜索成员的祖先</param> /// <returns>自定义特性的数组</returns>Attribute[] GetCustomAttributes(modeltype, inherit);### 利用特性傳回的關鍵屬性組合,在資料庫中###查詢###數據,如果能查到至少一筆記錄,則依照一定的邏輯處理; 如果不能,則可以直接寫入新資料。 Attribute類別中提供的方法說明:###rrreee
以上是.NET框架-應用特性和反射檢查資料唯一性的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!