Example #1
0
        private void button1_Click(object sender, EventArgs e)
        {
            txtLog.AppendText(System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion() + "\r\n");

            int count = 1000000;

            OrderInfo    testObj  = new OrderInfo();
            PropertyInfo propInfo = typeof(OrderInfo).GetProperty("OrderId");

            txtLog.AppendText("直接访问花费时间:       " + "\r\n");
            Stopwatch watch1 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                testObj.OrderId = 123;
            }

            watch1.Stop();
            txtLog.AppendText(watch1.Elapsed.ToString() + "\r\n");

            SetValueDelegate setter2 = DynamicMethodFactory.CreatePropertySetter(propInfo);

            txtLog.AppendText("EmitSet花费时间:        " + "\r\n");
            Stopwatch watch2 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                setter2(testObj, 123);
            }

            watch2.Stop();
            txtLog.AppendText(watch2.Elapsed.ToString() + "\r\n");

            txtLog.AppendText("纯反射花费时间:        " + "\r\n");
            Stopwatch watch3 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                propInfo.SetValue(testObj, 123, null);
            }

            watch3.Stop();
            txtLog.AppendText(watch3.Elapsed.ToString() + "\r\n");

            txtLog.AppendText("-------------------" + "\r\n");
            txtLog.AppendText(string.Format("{0} / {1} = {2}",
                                            watch3.Elapsed.ToString(),
                                            watch1.Elapsed.ToString(),
                                            watch3.Elapsed.TotalMilliseconds / watch1.Elapsed.TotalMilliseconds) + "\r\n");

            txtLog.AppendText(string.Format("{0} / {1} = {2}",
                                            watch3.Elapsed.ToString(),
                                            watch2.Elapsed.ToString(),
                                            watch3.Elapsed.TotalMilliseconds / watch2.Elapsed.TotalMilliseconds) + "\r\n");

            txtLog.AppendText(string.Format("{0} / {1} = {2}",
                                            watch2.Elapsed.ToString(),
                                            watch1.Elapsed.ToString(),
                                            watch2.Elapsed.TotalMilliseconds / watch1.Elapsed.TotalMilliseconds) + "\r\n");
        }
Example #2
0
        public static IList <T> ConvertJsonToList <T>(IEnumerable <JToken> jtokens) where T : class, new()
        {
            IList <T> list = new List <T>(); //里氏替换原则
            T         t    = default(T);

            PropertyInfo[] propertypes = null;
            string         tempName    = string.Empty;

            propertypes = t.GetType().GetProperties(); //得到类的属性
            foreach (JToken row in jtokens)
            {
                t = Activator.CreateInstance <T>(); ////创建指定类型的实例

                foreach (PropertyInfo pro in propertypes)
                {
                    tempName = pro.Name;
                    object value = row[tempName];
                    if (value is System.DBNull)
                    {
                        value = "";
                    }

                    var setDelegate = DynamicMethodFactory.CreatePropertySetter(pro);

                    setDelegate(t, value);
                }
                list.Add(t);
            }
            return(list);
        }
Example #3
0
        public static T ToDto <T>(this JToken data) where T : new()
        {
            var tempResult = Activator.CreateInstance <T>();        ////创建指定类型的实例

            var propertypes = tempResult.GetType().GetProperties(); //得到类的属性

            if (data != null)
            {
                foreach (PropertyInfo pro in propertypes)
                {
                    var tempName    = pro.Name.ToLower();
                    var value       = data[pro.Name] != null ? data[pro.Name] : data[tempName];
                    var setDelegate = DynamicMethodFactory.CreatePropertySetter(pro);
                    if (value == null)
                    {
                        setDelegate(tempResult, GetDefaultValue(pro.PropertyType));
                    }
                    else
                    {
                        setDelegate(tempResult, GetValue(pro, value));
                    }
                }
            }
            else
            {
                tempResult = data.Deserialize <T>();
            }


            return(tempResult);
        }
Example #4
0
        public void DynamicMethodFactory_CreatePropertySetter()
        {
            int              value            = 5;
            PropertyInfo     vo               = typeof(User).GetProperties().FirstOrDefault(f => f.Name == "Age");
            SetValueDelegate setValueDelegate = DynamicMethodFactory.CreatePropertySetter(vo);
            User             user             = new User();

            if (setValueDelegate != null)
            {
                setValueDelegate(user, value);
            }
            Assert.Equal(user.Age, value);
        }
Example #5
0
        public void DynamicMethodFactory_CreatePropertySetter_VO_INT()
        {
            int          value    = 12;
            PropertyInfo vo       = typeof(User).GetProperties().FirstOrDefault(f => f.Name == "Address");
            PropertyInfo property = typeof(Address).GetProperties().FirstOrDefault(f => f.Name == "Number");

            SetValueDelegate setValueDelegate = DynamicMethodFactory.CreatePropertySetter(vo, property);
            User             user             = new User();

            if (setValueDelegate != null)
            {
                setValueDelegate(user, value);
            }

            Assert.True(user.Address != null);
            Assert.Equal(user.Address.Number, value);
        }
    public static void FastSetValue(this PropertyInfo propertyInfo, object obj, object value)
    {
        if (propertyInfo == null)
        {
            throw new ArgumentNullException(nameof(propertyInfo));
        }

        SetValueDelegate setter = (SetValueDelegate)SetterDic[propertyInfo];

        if (setter == null)
        {
            setter = DynamicMethodFactory.CreatePropertySetter(propertyInfo);
            SetterDic[propertyInfo] = setter;
        }

        setter(obj, value);
    }
Example #7
0
        static string Test_SetProperty(int count)
        {
            StringBuilder sb = new StringBuilder(System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion());

            sb.AppendLine();
            sb.AppendLine("Test_SetProperty");
            OrderInfo    testObj  = new OrderInfo();
            PropertyInfo propInfo = typeof(OrderInfo).GetProperty("OrderID");

            sb.Append("直接访问花费时间:       ");
            Stopwatch watch1 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                testObj.OrderID = 123;
            }

            watch1.Stop();
            sb.AppendLine(watch1.Elapsed.ToString());


            SetValueDelegate setter2 = DynamicMethodFactory.CreatePropertySetter(propInfo);

            sb.Append("EmitSet花费时间:        ");
            Stopwatch watch2 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                setter2(testObj, 123);
            }

            watch2.Stop();
            sb.AppendLine(watch2.Elapsed.ToString());


            sb.Append("纯反射花费时间:        ");
            Stopwatch watch3 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                propInfo.SetValue(testObj, 123, null);
            }

            watch3.Stop();
            sb.AppendLine(watch3.Elapsed.ToString());



            sb.Append("泛型委托花费时间:       ");
            SetterWrapper <OrderInfo, int> setter3 = new SetterWrapper <OrderInfo, int>(propInfo);
            Stopwatch watch4 = Stopwatch.StartNew();

            for (int i = 0; i < count; i++)
            {
                setter3.SetValue(testObj, 123);
            }

            watch4.Stop();
            sb.AppendLine(watch4.Elapsed.ToString());


            //Console.Write("通用接口花费时间:       ");
            //ISetValue setter4 = GetterSetterFactory.CreatePropertySetterWrapper(propInfo);
            //Stopwatch watch5 = Stopwatch.StartNew();

            //for (int i = 0; i < count; i++)
            //    setter4.Set(testObj, 123);

            //watch5.Stop();
            //Console.WriteLine(watch5.Elapsed.ToString());



            //propInfo.FastSetValue(testObj, 123);
            //Console.Write("FastSet花费时间:       ");
            //Stopwatch watch6 = Stopwatch.StartNew();

            //for (int i = 0; i < count; i++)
            //    propInfo.FastSetValue(testObj, 123);

            //watch6.Stop();
            //Console.WriteLine(watch6.Elapsed.ToString());



            //propInfo.FastSetValue2(testObj, 123);
            //Console.Write("FastSet2花费时间:      ");
            //Stopwatch watch6b = Stopwatch.StartNew();

            //for (int i = 0; i < count; i++)
            //    propInfo.FastSetValue2(testObj, 123);

            //watch6b.Stop();
            //Console.WriteLine(watch6b.Elapsed.ToString());



            //Hashtable table = new Hashtable();
            //table[propInfo] = new object();
            //Console.Write("Hashtable花费时间:      ");
            //Stopwatch watch7 = Stopwatch.StartNew();

            //for (int i = 0; i < count; i++)
            //{
            //    object val = table[propInfo];
            //}
            //watch7.Stop();
            //Console.WriteLine(watch7.Elapsed.ToString());



            sb.AppendLine("-------------------");
            sb.Append("纯反射/直接赋值:     ");
            sb.AppendFormat("{0} / {1} = {2}",
                            watch3.Elapsed.ToString(),
                            watch1.Elapsed.ToString(),
                            watch3.Elapsed.TotalMilliseconds / watch1.Elapsed.TotalMilliseconds);
            sb.AppendLine();
            sb.Append("纯反射/EmitSet:     ");
            sb.AppendFormat("{0} / {1} = {2}",
                            watch3.Elapsed.ToString(),
                            watch2.Elapsed.ToString(),
                            watch3.Elapsed.TotalMilliseconds / watch2.Elapsed.TotalMilliseconds);
            sb.AppendLine();
            sb.Append("EmitSet/直接赋值:     ");
            sb.AppendFormat("{0} / {1} = {2}",
                            watch2.Elapsed.ToString(),
                            watch1.Elapsed.ToString(),
                            watch2.Elapsed.TotalMilliseconds / watch1.Elapsed.TotalMilliseconds);

            //Console.WriteLine("{0} / {1} = {2}",
            //    watch3.Elapsed.ToString(),
            //    watch5.Elapsed.ToString(),
            //    watch3.Elapsed.TotalMilliseconds / watch5.Elapsed.TotalMilliseconds);

            //Console.WriteLine("{0} / {1} = {2}",
            //    watch3.Elapsed.ToString(),
            //    watch6.Elapsed.ToString(),
            //    watch3.Elapsed.TotalMilliseconds / watch6.Elapsed.TotalMilliseconds);
            return(sb.ToString());
        }