C#中屬性PropertyInfo的使用

來源:互聯網
上載者:User

標籤:contains   ret   orm   自動屬性   count()   欄位   []   很多   慢慢   

昨天編程遇到一個問題兩個類欄位都是二十多個,其中有十多個是相同的,需要將一個類的欄位賦值給另外一個類,開始的自己想手動的一個個去賦值,後來想來一下C#基礎知識,用PropertyInfo就可以解決類似的問題,部落格園寫部落格需要內容詳實,我還是慢慢的C#屬性從頭寫起,先看下屬性的定義吧:

屬性定義:它提供靈活的機制來讀取、編寫或計算某個私人欄位的值。 可以像使用公用資料成員一樣使用屬性,但實際上它們是稱作“訪問器”的特殊方法。 這使得可以輕鬆訪問資料,此外還有助於提高方法的安全性和靈活性。屬性通常可以分為常規屬性和自動屬性。兩者之間還是有一點區別的,最開始編程對著兩個全無概念。

常規屬性

 常規屬性以前做Winform的時候經常使用,現在開始使用EF,基本上都是使用自動屬性,看下常規屬性的完成構成:

1.私人欄位,一般設定為私人,通過屬性來賦值保證起安全性:

1

private string _age;

2.get訪問器,負責讀取資料,其中可以進行自己的邏輯判斷和資料驗證,以return或者throw結束:

1

2

3

4

5

get

 {

     //年齡傳回值判斷

     return _age> 0 ? _age: 0;

 }

3.set訪問器,負責給屬性賦值,類似於一個傳回型別為void的方法,可以包含邏輯處理,例如可以根據預設的值通過計算後返回結果。

自動屬性

   上面簡單的說了一下常規屬性,當屬性訪問器中不需要其他邏輯時,可以使用自動屬性,不過需要注意一點的就是聲明自動屬性時,編譯器將建立一個私人的匿名後備欄位,該欄位只能通過屬性的 get 和 set 訪問器進行訪問。

1

public int Id { get; set; }

自動屬性沒有太多可以可以說的東西,簡單的對比一下常規屬性和自動屬性之間的區別吧:

        1.自動實作屬性必須同時聲明 get 和 set 訪問器。建立 readonly 自動實現屬性時,需要將set 訪問器設定為private 。

        2自動實作屬性上可以使用特性,不能用在支援後備欄位上。 如果屬性的後備欄位上使用特性,則應該只建立常規屬性。
       3.自動實現屬性get,和set中不能包含特殊的邏輯處理。與欄位類似,但不同於欄位。與欄位不同,屬性不作為變數來分類,不能將屬性作為 ref參數或 out參數傳遞。

屬性PropertyInfo的使用

 上面大概簡單的說了一下屬性和自動屬性之間的區別,現在可以迴歸到文中最開始的時候的那個問題:

1.案例1,如果兩個類中有大部分的欄位相同,需要將其中一個類的欄位賦值給另外一個類:

定義Person類:

1

2

3

4

5

6

7

8

9

10

11

public class Person {

       public Person(int id,string name,string address)

       {

           this.Id = id;

           this.Name = name;

           this.Address = address;

       }

       public int Id { get; set; }

       public string Name { get; set; }

       public string Address { get; set; }

   }

 定義User類

1

2

3

4

5

public class User {

       public int Id { get; set; }

       public string Name { get; set; }

       public string Group { get; set; }

   }

 轉換方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static User ConvertObject(User user,Person person)

       {

           PropertyInfo[] userPro = user.GetType().GetProperties();

           PropertyInfo[] personPro = person.GetType().GetProperties();

           if (userPro.Length>0&&personPro.Length>0)

           {

               for (int i = 0; i < userPro.Length; i++)

               {

                   for (int j = 0; j < personPro.Length; j++)

                   {<br>              //判斷User的屬性是不是的Person中

                       if (userPro[i].Name == personPro[j].Name && userPro[i].PropertyType == personPro[j].PropertyType)

                       {

                           Object value=personPro[j].GetValue(person, null);

                          //將Person中屬性的值賦值給User<br>                  userPro[i].SetValue(user,value , null);

                       }

                   }

               }

           }

           return user;

       }

 方法的調用:

1

2

3

4

5

6

7

8

9

10

static void Main(string[] args)

      {

          Person person = new Person(1,"FlyElephant","北京");

          User user = new User();

          user.Id = 20;

          user = ConvertObject(user, person);

          Console.WriteLine("Id:" + user.Id + "Name:" + user.Name + "角色:" + user.Group);

          System.Console.Read();

      }

     

2.之前在做Winform的時候就經常回使用到SqlHelper,現在也有很多公司是這麼使用的,當時很多東西感覺就是重複性的操作,一度以為編程只是複製粘貼,下面這段代碼大家應該很常見:

1

2

3

4

5

6

7

8

9

10

List<Person> list = new List<Person>();

SqlDataReader sdr = new SqlDataReader();

while (sdr.Read())

{

    Person person = new Person();

    person.Name = sdr.GetString(0);

    //....下面類似

    list.Add(person);

}

   

開始寫的時候覺得是鍛煉了,寫的多了就覺得無聊了,其實完全可以換一種方式來實現上面的代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public static List<T> ConvertData<T>(SqlDataReader sdr)

     {

         List<T> list = new List<T>();

         Type type = typeof(T);

         PropertyInfo[] properties = type.GetProperties();

         while (sdr.Read())

         {

             T model = Activator.CreateInstance<T>();

             for (int i = 0; i < properties.Length; i++)

             {

                 for (int j = 0; j < sdr.FieldCount; j++)

                 {

                     //判斷屬性的名稱和欄位的名稱是否相同

                     if (properties[i].Name == sdr.GetName(j))

                     {

                         Object value =sdr[j];

                         //將欄位的值賦值給User中的屬性

                         properties[i].SetValue(model, value, null);

                     }

                 }

             }

             list.Add(model);

         }

         return list;

     }

 

1

2

3

List<User> list = new List<User>();

SqlDataReader sdr = cmd.ExecuteReader();

list = ConvertData<User>(sdr);

3.案例三,ajax頁面傳遞值可以使用get方式,或者post方式的傳遞JSON格式資料轉換

 簡單的轉換一個get傳遞的字串Name=xx&Age=xx,後台直接用一個字典去類比了:

1

2

3

4

Dictionary<string, object> dic = new Dictionary<string, object>();

dic.Add("Id",100);

dic.Add("Name", "keso");

dic.Add("Group", "程式員");

 轉換字典方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static T ConvertDic<T>(Dictionary<string, object> dic)

      {

          T model = Activator.CreateInstance<T>();

          PropertyInfo[] modelPro = model.GetType().GetProperties();

          if (modelPro.Length > 0 && dic.Count() > 0)

          {

              for (int i = 0; i < modelPro.Length; i++)

              {

                  if (dic.ContainsKey(modelPro[i].Name))

                  {

                      modelPro[i].SetValue(model, dic[modelPro[i].Name], null);

                  }

              }

          }

          return model;

      }

  最後的調用:

1

User user = ConvertDic<User>(dic);

C#中屬性PropertyInfo的使用(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.