Pages - Menu

2017年1月11日 星期三

C# 反射 使用 Type.getType(string) 抓不到正確類別

反射需要先用動態的方式,尋找類別的名稱,

才能正確解析出他所使用的類別。

一開始的程式 是參考 slashlook  的這篇程式碼。

但就是跑不起來,在建立類別的執行個體時,會發生錯誤,該值不能為null

 

string cTargetClassName = "Sample_Reflection.Program.Transportation";

System.Object oTemp = System.Activator.CreateInstance(System.Type.GetType(cTargetClassName));

在stackOverflow查到一篇文章

看到有人使用typeof,就想到利用typeof去查目前clss的正確型別,

果然一整個神奇阿(有人知道原因為何還請告訴我)。

StepShot_12_02_12

1.在程式執行期間,下中斷點。

2.到即時運算視窗輸入 上面圖片藍色底的部份

    typeof(XXX) ,XXX要輸入類別名稱。

3.看到FullName的整個字串,他就是你要查的類別名稱..

4.直接使用Type.getType(字串)  ,就能夠建立實體了。

完整程式碼修改如下:

namespace Sample_Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用者輸入
            System.Console.Write("請輸入您的交通工具類型(1.摩托車;2.汽車):");
            int iMachineType = System.Convert.ToInt32(System.Console.ReadLine());
            System.Console.Write("請輸入您的交通工具匿稱:");
            string cTargetName = System.Console.ReadLine();


            string cTargetClassName = "Sample_Reflection.Program+Transportation";
           
            string cTargetProperty = "Name";
            string cTargetMethodName = "Wheels";

            System.Object oTemp = System.Activator.CreateInstance(System.Type.GetType(cTargetClassName));
            System.Type oTypeBase = System.Type.GetType(cTargetClassName);

            //設定與展示物件的名稱屬性
            System.Reflection.PropertyInfo oProperty = oTypeBase.GetProperty(cTargetProperty);
            oProperty.SetValue(oTemp, cTargetName);
            System.Console.Write("您的愛車{0}", oProperty.GetValue(oTemp));

            //依使用者選擇的「字串」,動態轉換物件去調用介面成員
            System.Object oEntity;
            switch (iMachineType)
            {
                case 2:
                    oTypeBase = System.Type.GetType("Sample_Reflection.Program+ICar");
                    oEntity = (ICar)oTemp;
                    break;
                default:
                    oTypeBase = System.Type.GetType("Sample_Reflection.Program+IBike");
                    oEntity = (IBike)oTemp;
                    break;
            }
            System.Reflection.MethodInfo oMethod = oTypeBase.GetMethod(cTargetMethodName);
            System.Console.WriteLine("擁有{0}顆輪子。", oMethod.Invoke(oEntity, null));

            System.Console.Read();
        }
        class Transportation : ICar, IBike
        {
            public string Name { get; set; }
            int ICar.Wheels() { return 4; }
            int IBike.Wheels() { return 2; }
        }

        //小客車介面
        interface ICar
        {
            int Wheels();
        }

        //機踏車介面
        interface IBike
        {
            int Wheels();
        }
    }
}

結論:

         同一個namespace底下要 用getType  取得下一層的東西要用 +

測試環境:

vs2015 community

Framework:4.5.2

 

1/11 補充:關於+號的意思,參考MSDN

分隔符號

意義
反斜線 (\) 逸出字元。
倒單引號 (') 前面有一個或多個代表型別參數,位於泛型型別名稱結尾的數字的數字。
括號 ([]) 括住的泛型型別引數清單,建構的泛型型別。在型別引數清單中,將組件限定的型別。
逗號 (,) 後面接著組件名稱。
句號 (.) 代表命名空間識別項。
加號 (+) 前面有巢狀的類別。

沒有留言:

張貼留言