Tags

, , ,

之前写了一篇如何用反射获取、更改属性的文章,实际上在C# 4.0中已经有对dynamic的支持了。用dynamic代价是运行之前没法查错,但是对于方法的调用确实方便了不少,另外有Cache的功能,性能也有提升

做了一个小测试:
测试持续时间: 0:00:00.1572083(Dynamic)

 

测试持续时间: 0:00:00.7764845

看起来性能提升不错(但还是没法解决项目需求,因为我需要根据一个字符串来判断)

测试代码如下:

using System;
using System.Dynamic;
using Microsoft.CSharp;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace DynamicPerformanceTest_UnitTest
{
    [TestClass]
    public class UnitTest1
    {
        int n = 200000;
        Random rd = new Random();
        [TestMethod]
        public void TestMethodReflection()
        {
            Obj[] objs = new Obj[n];
            int i;
            for (i = 0; i < n; i++)
            {
                objs[i] = new Obj();
            }
            i = 0;
            foreach (Obj t in objs)
            {
                t.setPropertyValue("id1", rd.Next().ToString());
                t.setPropertyValue("id2", t.getPropertyValue("id1"));
            }
        }

        [TestMethod]
        public void TestMethodDynamic()
        {
            Obj[] objs = new Obj[n];
            int i;
            for (i = 0; i < n; i++)
            {
                objs[i] = new Obj();
            }
            i = 0;
            foreach (dynamic t in objs)
            {
                t.id1 = i.ToString(rd.Next().ToString());
                t.id2 = t.id1;
            }
        }
    }
}