反射和特性(3.動態創建和調用)

動態創建對象

在前面節中,我們先了解了反射,然後利用反射查看了類型信息,並學習瞭如何創建自定義特性,並利用反射來遍歷它。可以說,前面三節,我們學習的都是反射是什麼,在接下來的章節中,我們將學習反射可以做什麼。在進行更有趣的話題之前,我們先看下如何動態地創建一個對象。

我們新建一個控制檯項目。然後,添加一個示範類,本文中將通過對這個示範類的操作來進行說明:

public class test
    {
        private int x;
        private int y;
        public test()
        {
            x = 0;
            y = 0;
        }
        public test(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        public int Add()
        {
            int total = 0;
            total = x + y;
            Console.WriteLine("Invoke Instance Method: ");
            Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total));
            return total;
        }

        public static void Add(int x, int y)
        {
            int total = x + y;
            Console.WriteLine("Invoke Static Method: ");
            Console.WriteLine(String.Format("[Add]: {0} plus {1} equals to {2}", x, y, total));
        }
    }

1.使用無參構造函數創建對象

Assembly asm = Assembly.GetExecutingAssembly();
object obj1 = asm.CreateInstance("SimpleExplore.test", true);
(obj1 as test).Add();

2.使用有參構造函數創建對象

Assembly asm = Assembly.GetExecutingAssembly();
Object[] parameters = new Object[2];   
parameters[0] = 3;
parameters[1] = 5;
object obj2 = asm.CreateInstance("SimpleExplore.test", true, BindingFlags.Default, null, parameters, null, null);
(obj2 as test).Add();

動態調用方法

接下來我們看一下如何動態地調用方法。注意,本文討論的調用不是將上面動態創建好的對象由Object類型轉換成Calculator類型再進行方法調用,這和“常規調用”就沒有區別了,讓我們以.Net Reflection 的方式來進行方法的調用。

1.使用InvokeMember調用方法

Assembly asm= Assembly.GetExecutingAssembly();
object obj1= asm.CreateInstance("SimpleExplore.test",true);
object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);
Type t = typeof(test);            t.InvokeMember("Add",BindingFlags.InvokeMethod,null,obj2,null);

調用靜態方法:

Assembly asm= Assembly.GetExecutingAssembly();
object obj1= asm.CreateInstance("SimpleExplore.test",true);
object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);
Type t = typeof(test);            
t.InvokeMember("Add", BindingFlags.InvokeMethod, null, typeof(test), new object[] { 3, 5 });

2.使用MethodInfo.Invoke調用方法

Assembly asm= Assembly.GetExecutingAssembly();
object obj1= asm.CreateInstance("SimpleExplore.test",true);
object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);
Type t = typeof(test);
//搜索public的實例成員
            t.GetMethod("Add",BindingFlags.Instance|BindingFlags.Public).Invoke(obj2,null);

調用靜態方法:

Assembly asm= Assembly.GetExecutingAssembly();
object obj1= asm.CreateInstance("SimpleExplore.test",true);
object obj2= asm.CreateInstance("SimpleExplore.test",true,BindingFlags.Default,null,new object[]{3,5},null,null);
Type t = typeof(test);
//搜索public的靜態成員
            t.GetMethod("Add",BindingFlags.Static|BindingFlags.Public).Invoke(obj2,null);
發佈了115 篇原創文章 · 獲贊 7 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章