C#反射是什麼?概念+代碼

//反射是.NET中的重要機制,通過反射,可以在運行時獲得.NET中每一個類型
	//(包括類、結構、委託、接口和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。
	//有了反射,即可對每一個類型瞭如指掌,如果獲得了構造函數的信息,即可直接創建對象
	class Program
    {
        //反射可以看到類的屬性和方法,設置和獲取屬性值,調用方法
        //    {   GetProperties  獲取屬性
        //Type      
        //    {   GetMethods     獲取方法
        //
        //                  {   GetValue(實例)
        //屬性 ProPertyInfo       
        //                  {   SetValue(實例,值)
        //
        //方法 MethodInfo    invoke(實例,參數)
        //
        static void Main(string[] args)
        {
            Stu s = new Stu() { Name = "佔山" };
            Stu s2 = new Stu() { Name = "王五" };

            Type t = s.GetType();

            //獲取所有屬性名稱
            var ps = t.GetProperties();
            //獲取所有方法名稱
            var ms = t.GetMethods();

            //顯示屬性
            foreach (var i in ps)
            {
                Console.WriteLine(i.Name);
            }

            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //顯示方法  前面兩個是隻讀和只寫的兩個方法,第三個是咱們定義的方法,後面四個是繼承自Object的方法
            foreach (var j in ms)
            {
                Console.WriteLine(j.Name);
            }
            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //給第一個學生賦值
            ps[0].SetValue(s, "里斯");
            //讀取值
            Console.WriteLine(s.Name);
            
            //獲取第二學生的姓名
            Console.WriteLine(ps[0].GetValue(s2));

            Console.WriteLine("-----------------------");
            Console.WriteLine("-----------------------");

            //調用方法,第一個值是學生信息,第二個是方法參數,沒有參數就傳null
            ms[2].Invoke(s, new object[] { "Hello","World"});

            Console.Read();
        }

        //學生類
        class Stu
        {
            public string Name { get; set; }

            public void Say(string a1, string a2)
            {
                Console.WriteLine(a1+" "+a2);
            }
        }
        
		//動態加載dll文件
        static void Main(string[] args)
        {
            // 路徑E盤下的dll文件
            Assembly a = Assembly.LoadFile(@"e:\ClassLibrary1.dll");
            //獲取所有類型
            //Type[] atypess = a.GetTypes();
            //foreach (Type t1 in atypess)
            //{
            //    Console.WriteLine(t1);
            //}

            //類型全名
            var s = a.CreateInstance("ClassLibrary1.Stu");
            //類型全名
            Type t = a.GetType("ClassLibrary1.Stu");
            //要獲取的屬性名
            var name = t.GetProperty("Name");
            var age = t.GetProperty("Age");
            //賦值
            name.SetValue(s, "張三");
            age.SetValue(s, 19);

            //獲取方法
            MethodInfo m = t.GetMethod("Say");
            //調用方法,傳入對應參數
            m.Invoke(s,new object[] { "晚上"});


            Console.ReadKey();
        }
    }

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