敲代碼遇到一個問題,因爲之前瞧的機房系統的組合查詢功能有許多的數據需要賦值給實體,如果一個一個賦值,這樣會導致產生許多相似的代碼,就會不符合封裝的要求,所以到網上查找之後,找到propertyinfo。
屬性定義:它提供靈活的機制來讀取、編寫或計算某個私有字段的值。 可以像使用公共數據成員一樣使用屬性,但實際上它們是稱作“訪問器”的特殊方法。 這使得可以輕鬆訪問數據,此外還有助於提高方法的安全性和靈活性。屬性通常可以分爲常規屬性和自動屬性。兩者之間還是有一點區別的,最開始編程對着兩個全無概念。
常規屬性
說起常規屬性,大家應該很舒心,因爲我們用Windows窗體應用的時候基本上都是使用自動屬性,看下常規屬性的完成構成:
1.私有字段,一般設置爲私有,通過屬性來賦值保證起安全性:
1 private string _age;
2.get訪問器,負責讀取數據,其中可以進行自己的邏輯判斷和數據驗證,以return或者throw結束:
1 get
2 {
3 //年齡返回值判斷
4 return _age> 0 ? _age: 0;
5 }
3.set訪問器,負責給屬性賦值,類似於一個返回類型爲void的方法,可以包含邏輯處理,例如可以根據默認的值通過計算後返回結果。
自動屬性
上面簡單的說了一下常規屬性,當屬性訪問器中不需要其他邏輯時,可以使用自動屬性,不過需要注意一點的就是聲明自動屬性時,編譯器將創建一個私有的匿名後備字段,該字段只能通過屬性的 get 和 set 訪問器進行訪問。這就是我們一般建立一個實體的時候給實體添加的屬性。
public int Id { get; set; }
自動屬性沒有太多可以可以說的東西,簡單的對比一下常規屬性和自動屬性之間的區別吧:
1.自動實現的屬性必須同時聲明 get 和 set 訪問器。創建 readonly 自動實現屬性時,需要將set 訪問器設置爲private 。
2.自動實現的屬性 (Property) 不允許具有屬性 (Attribute)。如果必須在屬性 (Property) 的後備字段上使用屬性 (Attribute),則應該只創建常規屬性 (Property)。
3.自動實現屬性get,和set中不能包含特殊的邏輯處理。與字段類似,但不同於字段。與字段不同,屬性不作爲變量來分類,不能將屬性作爲 ref參數或 out參數傳遞
上面大概簡單的說了一下屬性和自動屬性之間的區別,現在可以迴歸到文中最開始的時候的那個問題:
1.案例1,如果兩個類中有大部分的字段相同,需要將其中一個類的字段賦值給另外一個類:
定義Person類:
屬性PropertyInfo的使用
1 public class Person {
2 public Person(int id,string name,string address)
3 {
4 this.Id = id;
5 this.Name = name;
6 this.Address = address;
7 }
8 public int Id { get; set; }
9 public string Name { get; set; }
10 public string Address { get; set; }
11 }
定義User類
public class User {
public int Id { get; set; }
public string Name { get; set; }
public string Group { get; set; }
}
轉換方法(當兩個類有很多字段都是一樣的話,你又不想一個一個去賦值,可以使用下面這個方法):
複製代碼
1 public static User ConvertObject(User user,Person person)
2 {
3 PropertyInfo[] userPro = user.GetType().GetProperties();
4 PropertyInfo[] personPro = person.GetType().GetProperties();
5 if (userPro.Length>0&&personPro.Length>0)
6 {
7 for (int i = 0; i < userPro.Length; i++)
8 {
9 for (int j = 0; j < personPro.Length; j++)
10 {
11 //判斷User的屬性是不是的Person中
12 if (userPro[i].Name == personPro[j].Name && userPro[i].PropertyType == personPro[j].PropertyType)
13 {
14 Object value=personPro[j].GetValue(person, null);
15 //將Person中屬性的值賦值給User userPro[i].SetValue(user,value , null);
16 }
17 }
18 }
19 }
20 return user;
21 }
方法的調用:
1 static void Main(string[] args)
2 {
3 Person person = new Person(1,"Jerry","北京");
4 User user = new User();
5 user.Id = 20;
6 user = ConvertObject(user, person);
7 Console.WriteLine("Id:" + user.Id + "Name:" + user.Name + "角色:" + user.Group);
8 System.Console.Read();
9 }