欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net反射与dynamic效率的简单比较

程序员文章站 2022-08-10 20:50:27
通过反射或dynamic,我们可以拿到object类对象属性的值,但他们的又有什么差别呢?我做了一下简单的比较:   using system; using system.colle...

通过反射或dynamic,我们可以拿到object类对象属性的值,但他们的又有什么差别呢?我做了一下简单的比较:

 

using system;
using system.collections.generic;
using system.linq;
using system.reflection;
using system.text;
using system.threading.tasks;

namespace linqtestconsole
{
    class program
    {
        static void main(string[] args)
        {

            list lo = new list();
            for (int i = 0; i <1500000; i++) {
                object o = new { name = "name" + i, age = i };
                lo.add(o);
            }

            datetime dt10= datetime.now;
            //通过dynamic取值
            foreach(dynamic o in lo){

                string s = o.name + "的年龄是:" + o.age + "岁";
            }
            datetime dt11 = datetime.now;
            timespan span = dt11.subtract(dt10);
            console.writeline("用时"+ span.minutes + "分钟" + span.seconds + "秒"+span.milliseconds+"毫秒");

            //通过反射取值
            foreach (object o in lo)
            {
               string s=getpropertyvaluebyname("name", o).tostring() + "的年龄是:" + getpropertyvaluebyname("age", o).tostring() + "岁";
            }
            datetime dt22 = datetime.now;
            span = dt22.subtract(dt11);
            console.writeline("用时" + +span.minutes + "分钟" + span.seconds + "秒" + span.milliseconds + "毫秒");

            
            console.read();
        }


        /// 
        /// 反射,通过属性名称,取值
        /// 
        ///
        ///
        /// 
        public static object getpropertyvaluebyname(string propertyname, object o)
        {
            if (o == null)
            {
                o = new { };
            }
            //创建一个返回对象  
            object returnobject = new object();
            propertyinfo[] p1 = o.gettype().getproperties();
            foreach (propertyinfo pi in p1)
            {
                if (pi.name.tolower() == propertyname.tolower())
                {
                    returnobject = pi.getvalue(o);
                }
            }
            return returnobject;
        }  
    }
}


 

运行结果:

 

.net反射与dynamic效率的简单比较

总结:

从上面可以看出,反射是有点慢的,以后还是尽量用dynamic吧,方便实用。

我比较的方式可能不是很正确,但是,这样的结果也在一定程度上反映了一些问题。