反射和特性(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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值