none
取得物件的所有成員與值 RRS feed

  • 問題

  • Q1.Type.GetMember()可以取得此類的成員,但是有沒有什麼方式可以取得某個物件的某些成員呢?

    例如:建立一物件,並透過迴圈一次取得所有成員或指定某種成員如Property如public等條件

    public class TestClass{
            public int PropertyA {get;set;} = 1;
            public int PropertyB {get;set;} = 2 ;
    }
    
    void TestFunction(){
            TestClass testClass = new TestClass();
            foreach(var item  in testClass.XXXXX){
    
            }
    }

    2019年6月24日 上午 06:54

解答

  • 這樣寫比較簡單吧 ? 取得非公開的執行個體屬性。

       var properties = this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);
       foreach (var p in properties )
       {
           Console.WriteLine(p.Name);
       }

    至於要取公開的屬性 (包含執行個體和靜態的) 直接呼叫無參數的 GetPropertites() 就好,因為 GetPropertites() 相當於 GetProperties(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)  

    如果你只要公開的執行個體屬性就改成 GetProperties( BindingFlags.Instance | BindingFlags.Public)  


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/





    2019年6月24日 上午 08:41
    版主
  • 假設this為Form1類別的物件參考, 取得this的public property的值可以這樣做:

                Type type = this.GetType();
                foreach (PropertyInfo prop in type.GetProperties())
                {
                    if (prop.DeclaringType.Attributes.ToString().Contains("Public"))
                    {
                        if (prop.MemberType==MemberTypes.Property)
                        {
                            Console.WriteLine($"{prop.Name}=>{prop.GetValue(this)}");
                        }
                    }                
                }

    • 已標示為解答 StuBoo 2019年6月27日 上午 07:06
    2019年6月24日 上午 08:09

所有回覆

  • Type class 中 Get甚麼的方法很多啊,也都有多載。

    例如, 專要取得 Property 有

    (1) Type.GetProperties Method  , 無參數的多載取得的就是 公開的執行個體屬性。

    另外一個有參數 : GetProperties(BindingFlags) 其中組合  BindingFlags enum 就可以取得非公開屬性 或是靜態屬性

    (2) Type.GetProperty  這就是取得 "單一的屬性" , 一樣有許多多載

    詳情參閱文件庫 (可以看到很多 Getxxxx 的方法)

    Type.GetProperties Method

    Type.GetProperty Method

    Type Class

    如果要取得或設定屬性值,請看 PropertyInfo Class  的 GetValue 和 SetValue 方法。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年6月24日 上午 07:09
    版主
  • 假設this為Form1類別的物件參考, 取得this的public property的值可以這樣做:

                Type type = this.GetType();
                foreach (PropertyInfo prop in type.GetProperties())
                {
                    if (prop.DeclaringType.Attributes.ToString().Contains("Public"))
                    {
                        if (prop.MemberType==MemberTypes.Property)
                        {
                            Console.WriteLine($"{prop.Name}=>{prop.GetValue(this)}");
                        }
                    }                
                }

    • 已標示為解答 StuBoo 2019年6月27日 上午 07:06
    2019年6月24日 上午 08:09
  • 這樣寫比較簡單吧 ? 取得非公開的執行個體屬性。

       var properties = this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);
       foreach (var p in properties )
       {
           Console.WriteLine(p.Name);
       }

    至於要取公開的屬性 (包含執行個體和靜態的) 直接呼叫無參數的 GetPropertites() 就好,因為 GetPropertites() 相當於 GetProperties(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public)  

    如果你只要公開的執行個體屬性就改成 GetProperties( BindingFlags.Instance | BindingFlags.Public)  


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/





    2019年6月24日 上午 08:41
    版主