找回密碼
 注冊帳號

掃一掃,訪問微社區

開果 c#反射入門篇(Reflection)——PropertyInfo 發現屬性

1
回復
1548
查看
打印 上一主題 下一主題
[ 復制鏈接 ]

15

主題

25

帖子

218

積分

Rank: 9Rank: 9Rank: 9

UID
327626
好友
6
蠻牛幣
87
威望
0
注冊時間
2019-7-19
在線時間
164 小時
最后登錄
2019-12-1

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
也算記錄自己的學習篇=。= 適合入門看    這里簡單介紹下PropertyInfo和他基本的幾個方法
#簡介
Property發現屬性并提供對屬性 元數據的訪問
1.如何獲取
Type.GetProperty(String) 獲取該類的指定的名字String公開的屬性  如果私有會為空
Type.GetProperty(String,BindingFlags) 獲取該類的指定的名字String,和指定類型BindingFlags的屬性
Type.GetProperties()   獲取該類的所有公開屬性
Type.GetProperties(BindingFlags) 獲取該類的所有指定類型BindingFlags的函數方法

例子

先定義個類型

[C#] 純文本查看 復制代碼
    public class Property

    {

        public int A { get; set; }

        public string B { get; set; }



        private int C { get; set; }

        private string D { get; set; }







    }

Type.GetMethod(String) 獲取該類的指定的名字String公開的函數方法  如果私有會為空
Type.GetMethod(String,BindingFlags) 獲取該類的指定的名字String,和指定類型BindingFlags的函數方
#Type.GetMethods()   獲取該類的所有公開的函數方法
Type.GetMethods(BindingFlags) 獲取該類的所有指定類型BindingFlags的函數方法

[C#] 純文本查看 復制代碼
            PropertyInfo property1 = typeof(Property).GetProperty("A");

            PropertyInfo property2 = typeof(Property).GetProperty("C");

            Console.WriteLine("公開的" + property1.Name);

            Console.WriteLine(property2!=null?"存在":"不存在");

            property2 = typeof(Property).GetProperty("C",BindingFlags.Instance|BindingFlags.NonPublic);//BindingFlags.Instance(對象) 和 BindingFlags.Static(靜態) 必須有一個,

            Console.WriteLine(property2 != null ? "存在" : "不存在");

            PropertyInfo[] propertys1 = typeof(Property).GetProperties();

            PropertyInfo[] propertys2 = typeof(Property).GetProperties();

            foreach (var item in propertys1)

            {

                Console.WriteLine("公開的"+item.Name);

            }

           

            propertys2 = typeof(Property).GetProperties(BindingFlags.NonPublic|BindingFlags.Instance);

            foreach (var item in propertys2)

            {

                Console.WriteLine("私有的的" + item.Name);

            }

            Console.ReadKey();





結果





2.屬性

這里就列幾個基礎的=。=完全的可以自己 去看c#的[API](https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.propertyinfo?view=netframework-4.8)

| 屬性            |                                  作用       |
| :-------: |:-------------:|
| GetMethod | 獲取此屬性的 get 訪問器 可以看做是一個帶返回值的函數,|
|SetMethod|獲取此屬性的 set 訪問器 可以看做是帶著一個賦值參數T的vold函數|
| CanRead***/***CanWrite| 返回bool用于判斷該屬性值是否可讀/寫  |
|PropertyType| 獲取該屬性的類型Type|
|MemberType| 返回一個枚舉表示他是一個屬性|



3.方法    =。=我就寫下基礎的幾個

  -  獲取公開的get訪問器 就是一個帶返回值的函數 如果為空就是私有或者不存在 MethodInfo GetGetMethod();
  -  獲取公開和私有的get訪問器 就是一個帶返回值的函數MethodInfo GetGetMethod(bool nonPublic);
  -  獲取公開的set訪問器 就是帶著一個賦值參數T的vold函數 如果為空就是私有或者不存在 MethodInfo SetGetMethod();
  -  獲取公開和私有的set訪問器 帶著一個賦值參數T的vold函數 MethodInfo GetSetMethod(bool nonPublic);

  -   獲取公開的get set訪問器 如果為空就是私有或者不存在 MethodInfo[] GetAccessors();
  -  獲取公開和私有的get set訪問器MethodInfo[] GetAccessors(bool nonPublic);     
    -  先聲明個類



[C#] 純文本查看 復制代碼
         public class Property

      {

        public string a;



        public string A1 { get { Console.WriteLine("運行了一次A1的Get"); return a; } set { Console.WriteLine("運行了一次A1的Get"); a = value; } }

        public string A2 { private get { Console.WriteLine("運行了一次A2的私有的Get"); return a; }  set { Console.WriteLine("運行了一次A2的Set"); a = value; } }

    }


例子

[C#] 純文本查看 復制代碼
              Property Instance = Activator.CreateInstance(typeof(Property)) as Property;
            Instance.a = "涼_開果";

            Console.WriteLine(typeof(Property).GetProperty("A2").GetGetMethod()!=null?"存在":"不存在");
            Console.WriteLine("用了GetGetMethod(true)之后");
            typeof(Property).GetProperty("A2").GetGetMethod(true).Invoke(Instance, null);

            Console.WriteLine("A1公開的get 和 set 訪問器{0}個", typeof(Property).GetProperty("A1").GetAccessors().Length);
            Console.WriteLine("A2公開的get 和 set 訪問器{0}個", typeof(Property).GetProperty("A2").GetAccessors().Length);
            Console.WriteLine("A2私有和公開的get 和 set 訪問器{0}個", typeof(Property).GetProperty("A2").GetAccessors(true).Length);

            Console.WriteLine("未調用Set之前a是:{0}", Instance.a);
            typeof(Property).GetProperty("A1").GetSetMethod(true).Invoke(Instance, new object[] { "賦值后的開果"});
            Console.WriteLine("調用Set后a是:{0}", Instance.a);

            Console.ReadKey();


結果



-  里面的MethodInfo.Invoke不知道什么意思的話 可以看這里[MethodInfo](https://www.jianshu.com/p/5c85668d00)
-  Set那里的Invoke 等于運行了一個帶參數函數賦值給a的 之后a就被賦值了


-  獲取 object GetValue(Object包含這個屬性類的實例化對象);
-  賦值SetValue(object包含這個屬性類的實例化對象 , object  要賦的值);
   - 當在派生類中被重寫時,為直接或間接的基類上的方法返回MethodInfo 就是找到他的 誰創建的這個函數
   -先聲明代碼


[C#] 純文本查看 復制代碼
        public class Property

                 {



                       public string A { get; set; }



                   }


   例子
[C#] 純文本查看 復制代碼
  
            Property Instance = new Property();
            Instance.A = "涼_開果";


            Console.WriteLine(typeof(Property).GetProperty("A").GetValue(Instance));
            Console.WriteLine("修改后");
            typeof(Property).GetProperty("A").SetValue(Instance,"修改后的開果");
            Console.WriteLine(typeof(Property).GetProperty("A").GetValue(Instance));
            Console.ReadKey();

     - 結果




Get就是會調屬性的get Set對應是Set

好了 差不多結束了=。=  不定期更新下篇


u3d萌新QQ群844087555——一個除了unity3d啥都會的群






回復

使用道具 舉報

6蠻牛粉絲
1049/1500
排名
10708
昨日變化

0

主題

755

帖子

1049

積分

Rank: 6Rank: 6Rank: 6

UID
301976
好友
1
蠻牛幣
1583
威望
0
注冊時間
2018-10-31
在線時間
196 小時
最后登錄
2019-12-9
沙發
2019-11-12 12:44:27 只看該作者
確實哈 。。。  
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

法甲球队主场名称