反射和特性(3.动态创建和调用)

来源:互联网 发布:矩阵的谱分解 编辑:程序博客网 时间:2024/06/06 03:12

动态创建对象

在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态地创建一个对象。

我们新建一个控制台项目。然后,添加一个示范类,本文中将通过对这个示范类的操作来进行说明:

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);
0 0
原创粉丝点击