1. 程式人生 > >【C#反射-動態建立物件】

【C#反射-動態建立物件】

上面部落格學習了使用反射檢視型別的資訊,以及使用反射獲取特性物件。

下面使用反射來動態建立物件。首先準備一個Test類:

    public class TestClass
    {
        public TestClass()
        {
            Console.WriteLine("這是一個無參建構函式");
        }
        public TestClass(int a, int b)
        {
            Console.WriteLine("這是一個有引數建構函式 > a+b=" + (a + b));
        }

        public int show()
        {
            return 1;
        }

        public static int show(int a,int b)
        {
            return a + b;
        }
    }
1.使用無參建構函式建立物件:
       //使用無參建構函式建立物件
            Assembly asm = Assembly.GetExecutingAssembly();//獲取當前程式碼所在程式集
            Object obj = asm.CreateInstance("AssemblyDemo.TestClass", true);//建立一個物件TestClass物件
            //列印:這是一個無參建構函式

            ObjectHandle handler = Activator.CreateInstance(null, "AssemblyDemo.TestClass");
            //CreateInstance 第一個引數為程式集名稱,為null 表示當前程式集,第二個引數表示要建立的型別
            Object obj1 = handler.Unwrap();
            //列印:這是一個無參建構函式
2.使用有引數建構函式建立物件:
       //使用有參建構函式建立物件            
            Object [] param= new  Object[2];
            param[0]=1;
            param[1]=2;
            Assembly asm2 = Assembly.GetExecutingAssembly();
            Object obj2 = asm2.CreateInstance("AssemblyDemo.TestClass", true, BindingFlags.Default, null, param ,null,null);
            //BindingFlag是限定對型別成員的搜尋,這裡Default不使用BindingFlags策略
3.動態呼叫方法:使用InvokeMember呼叫方法
       //動態呼叫無引數方法
            Type t = typeof(TestClass);
            TestClass ts=new TestClass (1,2);
            int result = (int)t.InvokeMember("show", BindingFlags.InvokeMethod,null,ts,null);
            Console.WriteLine(result);
       //動態呼叫有參靜態方法
            Type t1 = typeof(TestClass);
            int result1 = (int)t1.InvokeMember("show",BindingFlags.InvokeMethod,null,t1,param);
            Console.WriteLine(result1);
4.使用MethodInfo.Invoke呼叫方法:
         //使用MethodInfo.Invoke呼叫方法
            Type t2 = typeof(TestClass);
            TestClass ts2 = new TestClass();
            MethodInfo mi = t2.GetMethod("show",BindingFlags.Instance|BindingFlags.Public);
            int result2=(int)mi.Invoke(ts2, null);
            Console.WriteLine(result2);

            Type t3 = typeof(TestClass);
            MethodInfo mi1 = t3.GetMethod("show",BindingFlags.Static|BindingFlags.Public);
            int result3 = (int)mi1.Invoke(null, param);
            Console.WriteLine(result3);