C# 通過反射獲取對象


 

 

獲取程序集方法1:

Assembly ass1 = Assembly.Load("InterfaceAndPolymorphism");//參數:程序集的長格式,就是右鍵 中的 程序集名稱

 

 

獲取程序集方法2:

Assembly ass2 = Assembly.LoadFile(System.IO.Directory.GetCurrentDirectory() + "\\InterfaceAndPolymorphism.exe");//參數:文件的路徑,加上文件名,注意加擴展名(這里是.exe)

 

 

獲取程序集方法3:

Assembly ass3 = Assembly.LoadFrom("InterfaceAndPolymorphism.exe");//參數:程序集的文件,跟上面方法2的區別就是上面方法2的可以放在任意的位置

完整代碼如下:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//【1】引入反射的命名空間
using System.Reflection;

namespace xiketang.com4
{
    /// <summary>
    /// 反射測試
    /// </summary>
    public class TestReflection
    {
        public void Test()
        {
            #region 獲取程序集

            //獲取程序集的常用的3個方法,一般都是用第一種方法
            Assembly ass1 = Assembly.Load("InterfaceAndPolymorphism");//參數:程序集的長格式,就是右鍵 中的 程序集名稱

            Assembly ass2 = Assembly.LoadFile(System.IO.Directory.GetCurrentDirectory() + "\\InterfaceAndPolymorphism.exe");//參數:文件的路徑,加上文件名,注意加擴展名(這里是.exe)

            Assembly ass3 = Assembly.LoadFrom("InterfaceAndPolymorphism.exe");//參數:程序集的文件,跟上面方法2的區別就是上面方法2的可以放在任意的位置


            #endregion

            #region 觀察程序集給我們的信息

            //觀察程序集給我們的信息
            Type[] types = ass1.GetTypes();//獲取程序集中自定義的類型
            foreach (var item in types)
            {
                //item.Name:類的名稱 --》  Dean            
                //item:類的完全限定名(命名空間+類名)--》 xiketang.com4.Dean
                Console.WriteLine(item.Name + "\t\t" + item);
            }
            //我們從一個程序集中,能夠找到所有的類型(類類型、接口類型、泛型類型......)

            Console.WriteLine("======================================================");

            // 官方解釋:獲取程序集實例中具有指定名稱的 System.Type 對象。
            //老師解釋:根據一個類的完全限定名字符串,從程序集中得到這個類的具體類型
            Type teacherType = ass1.GetType("xiketang.com4.Teacher"); //參數:類的完全限定名字符串,這個字符串嚴格區分大小寫

            //這個Type就是包括了一個類型的所有成員快照

            //我們通過一個對象的類型,可以找到類的所有成員,比如我找Teacher的所有屬性
            PropertyInfo[] properties = teacherType.GetProperties();
            //這些在我們后面自己開發ORM框架時候,非常有用。

            #endregion

            #region 創建對象

            //創建Teacher對象方法1
            Teacher teacher1 = (Teacher)Activator.CreateInstance(teacherType);

            //  使用指定類型的默認構造函數來創建該類型的實例。
            // public static object CreateInstance(Type type);

            //創建Teacher對象方法2
            Teacher teacher2 = (Teacher)ass1.CreateInstance("xiketang.com4.Teacher");


            //上面的內容合並寫
            Teacher teacher3 = (Teacher)Assembly.Load("InterfaceAndPolymorphism").CreateInstance("xiketang.com4.Teacher");

            #endregion

            #region 帶參數的構造方法 創建對象

            //上面創建對象是無參數的構造防范,下面演示帶參數的構造方法
            //通過構造方法創建對象(下面請大家記住方法)
            object object1 = Activator.CreateInstance(teacherType, new object[] { "常老師" });
            object object2 = Activator.CreateInstance(teacherType, new object[] { "常老師", "130000000000000" });

            #endregion


        }
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM