反射的心得與不得

Q:反射是個神馬浮雲?

A:反射是個裝B的“類拆卸機”(拆卸機應該是反射的親民稱呼。注意,它拆的是類不是對象。類和對象,就好比是圖紙和根據圖紙製造出來的實物。),它把一個類拆得昏天暗地,並把拆卸下來的成員封裝爲一個叫做System.RuntimeType的類中,提供各種方法讓人使用拆下的成員。

Q:裝B的拆卸機拆卸一個類後怎麼歸類原來的成員?

A:是這樣的,牛逼機提供一個枚舉來檢索它歸成什麼類,叫做 MemberTypes,包含:

  成員名稱 說明
  Constructor

構造函數,表示 ConstructorInfo 成員。 0x01 的十六進制值。縮寫爲.ctor

  Event 事件,表示 EventInfo 成員。 0x02 的十六進制值。
  Field 字段,表示 FieldInfo 成員。 0x04 的十六進制值。
  Method              方法,表示 MethodInfo 成員。 0x08 的十六進制值。
  Property   屬性,表示 PropertyInfo 成員。 0x10 的十六進制值。
  TypeInfo                   類型,表示 TypeInfo 成員。 0x20 的十六進制值。
  Custom 自定義成員類型。 0x40 的十六進制值。
  NestedType 嵌套類型,可擴展 MemberInfo
  All

指定所有成員類型

Q:一個類被拆卸後,可不可以用"."來引用?

A:不行,完全不行,已經被拆不存在原來的結構了,不要幻想用"."來引用,老老實實用拆卸機的各種方法。

Q:舉個例子,如何通過拆卸機(反射)操作嵌套類。

A:行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(abc);

            Type[] mb = type.GetNestedTypes(BindingFlags.Public | BindingFlags.Instance);

            foreach (var ss in mb)
            {
                Console.WriteLine(ss.Name + "  ----->  " + ss.ReflectedType);

                FieldInfo info = ss.GetField("abc1str");
                object obj = Activator.CreateInstance(ss);//實例化嵌套類,如果abc1str是靜態成員,則無需實例化即可訪問
                Console.WriteLine(info.GetValue(obj));//從實例中取得"abc1str"字段的值,如果abc1str是靜態成員,則可可以info.GetValue(ss)
            }



            Console.ReadKey(true);
        }
    }

    class abc
    {
        public string s1 = "abc1.s1";
        private string v1;

        public string V1
        {
            get { return v1;}
            set { v1 = value; }
        }
        public void abc1_pr(string pr)
        {
            Console.WriteLine(pr);
        }
        public class abc1
        {
            public string abc1str = "abc1.text";
            public static string aaa = "aaa";
        }
    }

}


(待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章