C#提高反射的调用性能

 代码: namespace CommonInterface
{
    /** <summary>
    /// 公用的接口
    /// </summary>
    public interface IFoo
    {
        string getName();
        string Name{get;}
    }
}
被反射调用的类
代码: using CommonInterface;

namespace ClassLibOne
{
    /** <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class FooOne:IFoo
    {
        public FooOne()
        {
        }
         
        public string getName()
        {
            return "FooOne";
        }

        public string Name
        {
            get
            {
                return "FooOne";
            }
        }
    }
}
调用者类
代码: using System;
using System.Reflection;
using CommonInterface;

namespace ReflectionMain
{
    /** <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class ReflectionMain
    {
        delegate string DgetName();
        /** <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //加载
            Assembly assembly = Assembly.LoadFile("D:\\Project2003\\BankTest\\Reflection\\ReflectionTest\\ReflectionMain\\bin\\Debug\\ClassLibOne.dll");
            Type type = assembly.GetType("ClassLibOne.FooOne");
            ConstructorInfo conInfo = type.GetConstructor(new Type[]{});
            object fooOne = conInfo.Invoke(new object[]{});

            //反射调用
            DateTime startR = DateTime.Now;
            for(int i=0;i<100000;i++)
            {
                object rtn;
                rtn = type.GetMethod("getName").Invoke(fooOne,new object[]{});
            }
            TimeSpan spanR = DateTime.Now - startR;
            Console.WriteLine("反射调用100,000次:"+spanR.ToString());

            //转换成接口后调用
            DateTime startI = DateTime.Now;
            for(int i=0;i<1000000;i++)
            {
                IFoo foo = (IFoo)fooOne;
                foo.getName();
            }
            TimeSpan spanI = DateTime.Now - startI;
            Console.WriteLine("转换成接口后调用1,000,000次:"+spanI.ToString());

            //用委托调用
            DateTime startDA = DateTime.Now;
            IFoo fooo = (IFoo)fooOne;
            DgetName dgn = new DgetName(fooo.getName);
            for(int i=0;i<10000;i++)
            {
                IFoo foo = (IFoo)fooOne;
                dgn += new DgetName(foo.getName);
            }
            TimeSpan spanDA = DateTime.Now - startDA;

            Console.WriteLine("用委托调用__添加到委托10,000:"+spanDA.ToString());

            DateTime startD = DateTime.Now;
            dgn();
            TimeSpan spanD = DateTime.Now - startD;

            Console.WriteLine("用委托调用10,000:"+spanD.ToString());

            Console.ReadLine();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值