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"); }
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); }
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); }
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); }
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); }
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()); }