public static bool IsNumber(object o) { if (o == null) { return(false); } if (o is TypeTool) { return(TypeTool.IsNumber(o.GetType())); } return(false); }
public static bool IsDateTime(object o) { if (o == null) { return(false); } if (o is TypeTool) { return(TypeTool.IsFloat(o.GetType())); } return(false); }
public static byte[] BinaryBy(Type type, long value, int size) { if (size < 0) { size = TypeTool.SizeBy(type); } byte[] buffer = new byte[size]; unchecked { for (int i = 0; i < size; i++) { buffer[i] = (byte)((value >> i * 8) & 0xFF); } } return(buffer); }
public static IList <TDesc> CopyList <TDesc>(IList src) { if (src == null) { throw new ArgumentNullException(); } List <TDesc> results = new List <TDesc>(src.Count); if (src.Count > 0) { Type elemt = TypeTool.GetArrayElement(src.GetType()); Type key = typeof(TDesc); Func <IList, IList, IList> f = GetListCopyProxy(key, elemt); f(src, results); } return(results); }
public static bool IsBasicType(Type type) { return(type == typeof(IPAddress) || TypeTool.IsDateTime(type) || TypeTool.IsNumber(type) || TypeTool.IsString(type) || TypeTool.IsFloat(type)); }
public static byte[] BinaryBy(ulong value) { return(TypeTool.BinaryBy(typeof(long), Convert.ToInt64(value), sizeof(ulong))); }
/// <summary> /// 注册类型拷贝(快速) /// </summary> public static bool RegisterCopy(Type desc, Type src) { if (src == null || desc == null) { return(false); } lock (m_pLook) { IDictionary <Type, Func <object, object> > l_pObjConvertTo = null; if (!m_pRegTObjCopys.TryGetValue(src, out l_pObjConvertTo)) { l_pObjConvertTo = new Dictionary <Type, Func <object, object> >(); m_pRegTObjCopys.Add(src, l_pObjConvertTo); } else if (l_pObjConvertTo.ContainsKey(desc)) { return(false); } ParameterExpression p__ebp = Expression.Parameter(typeof(object)); ParameterExpression p__desc = Expression.Variable(desc, "desc"); ParameterExpression p__src = Expression.Variable(src, "src"); List <Expression> ls = new List <Expression>() { Expression.Assign(p__src, Expression.Convert(p__ebp, src)), Expression.Assign(p__desc, Expression.New(desc)) }; foreach (PropertyInfo pi in src.GetProperties()) { PropertyInfo pp = desc.GetProperty(pi.Name); if (pp != null) { Type clazz = pp.PropertyType; // 编织 if ((clazz == pi.PropertyType) || TypeTool.IsBasicType(clazz) || TypeTool.IsBasicType(TypeTool.GetArrayElement(clazz))) { ls.Add(Expression.Assign(Expression.Property(p__desc, pp), Expression.Convert(Expression.Property(p__src, pi), pp.PropertyType))); } else { if (!TypeTool.IsList(clazz)) { ls.Add(Expression.IfThen(Expression.NotEqual(Expression.Property(p__src, pi), Expression.Constant(null)), Expression.Assign( Expression.Property(p__desc, pp), Expression.TypeAs(Expression.Call( Expression.MakeIndex( Expression.Constant(l_pObjConvertTo), typeof(IDictionary <Type, Func <object, object> >).GetProperties()[0], new[] { Expression.Constant(clazz) }), typeof(Func <object, object>).GetMethod("Invoke"), Expression.Property(p__src, pi) ), clazz) ) ) ); } else { Type xe_desc = TypeTool.GetArrayElement(clazz); Type xe_src = pi.PropertyType; ParameterExpression size = Expression.Variable(typeof(int), "size"); ParameterExpression j = Expression.Variable(typeof(int), "j"); ParameterExpression d = Expression.Variable(typeof(Func <object, object>), "d"); ParameterExpression m = Expression.Variable(clazz, "m"); ParameterExpression item = Expression.Variable(xe_desc, "item"); Expression get = Expression.Assign(item, Expression.TypeAs(Expression.Call(d, typeof(Func <object, object>).GetMethod("Invoke"), Expression.MakeIndex(Expression.Property(p__src, pi), xe_src.GetProperty("Item", new[] { typeof(int) }), new[] { Expression.PostIncrementAssign(j) })), xe_desc)); Expression set = null; if (clazz.IsArray) { set = Expression.MakeIndex(m, clazz.GetProperty("Item"), new[] { j }); set = Expression.Assign(item, set); } else { set = Expression.Call(m, clazz.GetMethod("Add"), new[] { item }); } LabelTarget label = Expression.Label(typeof(int)); Expression exp = Expression.IfThen(Expression.NotEqual(Expression.Constant(null), Expression.Property(p__src, pi)), Expression.Block(new[] { size, j, d, m, item }, Expression.Assign(size, Expression.Property(Expression.Property(p__src, pi), "Length")), Expression.Assign(j, Expression.Constant(0)), Expression.Assign(d, Expression.MakeIndex( Expression.Constant(l_pObjConvertTo), typeof(IDictionary <Type, Func <object, object> >).GetProperties()[0], new[] { Expression.Constant(xe_desc) }) ), Expression.Assign(Expression.Property(p__desc, pp), Expression.New(clazz.GetConstructor(new Type[] { typeof(int) }), size)), Expression.Assign(m, Expression.Property(p__desc, pp)), Expression.Loop(Expression.IfThenElse(Expression.GreaterThanOrEqual(j, size), Expression.Break(label, j), Expression.Block(get, set)) , label) ) ); ls.Add(exp); } } } } Expression <Func <object, object> > ee = Expression.Lambda <Func <object, object> >(Expression.Block(new[] { p__desc, p__src }, Expression.Block(ls.ToArray()), p__desc), p__ebp); Func <object, object> f = ee.Compile(); l_pObjConvertTo.Add(desc, f); return(true); } }
private static Func <IList, IList, IList> CreateCopyList(Type desc, Type src) { ParameterExpression s = Expression.Parameter(typeof(IList), "s"); ParameterExpression n = Expression.Parameter(typeof(IList), "n"); LabelTarget @continue = Expression.Label(typeof(void), "LABEL_0002"); LabelTarget @break = Expression.Label(typeof(int), "LABEL_0001"); ParameterExpression len = Expression.Variable(typeof(int), "len"); ParameterExpression i = Expression.Variable(typeof(int), "i"); ParameterExpression p__src = Expression.Variable(src, "src"); ParameterExpression p__desc = Expression.Variable(desc, "desc"); List <Expression> ls = new List <Expression>(); ls.Add(Expression.Assign(p__desc, Expression.New(p__desc.Type))); foreach (PropertyInfo pi in src.GetProperties()) { PropertyInfo pp = desc.GetProperty(pi.Name); if (pp != null) { Type clazz = pp.PropertyType; // 编织 if ((clazz == pi.PropertyType) || TypeTool.IsBasicType(clazz) || TypeTool.IsBasicType(TypeTool.GetArrayElement(clazz))) { ls.Add(Expression.Assign(Expression.Property(p__desc, pp), Expression.Property(p__src, pi))); } else { if (!TypeTool.IsList(clazz)) { ls.Add(Expression.IfThen(Expression.NotEqual(Expression.Property(p__src, pi), Expression.Constant(null)), Expression.Assign( Expression.Property(p__desc, pp), Expression.TypeAs(Expression.Call( Expression.MakeIndex( Expression.Constant(GetObjectConvertTo(pp.PropertyType, pi.PropertyType)), typeof(IDictionary <Type, Func <object, object> >).GetProperties()[0], new[] { Expression.Constant(clazz) }), typeof(Func <object, object>).GetMethod("Invoke"), Expression.Property(p__src, pi) ), clazz) ) ) ); } else { Type xe_desc = TypeTool.GetArrayElement(clazz); Type xe_src = pi.PropertyType; ParameterExpression size = Expression.Variable(typeof(int), "size"); ParameterExpression j = Expression.Variable(typeof(int), "j"); ParameterExpression d = Expression.Variable(typeof(Func <object, object>), "d"); ParameterExpression m = Expression.Variable(clazz, "m"); ParameterExpression item = Expression.Variable(xe_desc, "item"); Expression get = Expression.Assign(item, Expression.TypeAs(Expression.Call(d, typeof(Func <object, object>).GetMethod("Invoke"), Expression.MakeIndex(Expression.Property(p__src, pi), xe_src.GetProperty("Item", new[] { typeof(int) }), new[] { Expression.PostIncrementAssign(j) })), xe_desc)); Expression set = null; if (clazz.IsArray) { set = Expression.MakeIndex(m, clazz.GetProperty("Item"), new[] { j }); set = Expression.Assign(item, set); } else { set = Expression.Call(m, clazz.GetMethod("Add"), new[] { item }); } LabelTarget label = Expression.Label(typeof(int)); Expression exp = Expression.IfThen(Expression.NotEqual(Expression.Constant(null), Expression.Property(p__src, pi)), Expression.Block(new[] { size, j, d, m, item }, Expression.Assign(size, Expression.Property(Expression.Property(p__src, pi), "Length")), Expression.Assign(j, Expression.Constant(0)), Expression.Assign(d, Expression.MakeIndex( Expression.Constant(GetObjectConvertTo(pp.PropertyType, pi.PropertyType)), typeof(IDictionary <Type, Func <object, object> >).GetProperties()[0], new[] { Expression.Constant(xe_desc) }) ), Expression.Assign(Expression.Property(p__desc, pp), Expression.New(clazz.GetConstructor(new Type[] { typeof(int) }), size)), Expression.Assign(m, Expression.Property(p__desc, pp)), Expression.Loop(Expression.IfThenElse(Expression.GreaterThanOrEqual(j, size), Expression.Break(label, j), Expression.Block(get, set)) , label) ) ); ls.Add(exp); } } } } ls.Add(Expression.Call(n, typeof(IList).GetMethod("Add"), p__desc)); Expression safe_cast = Expression.MakeIndex(s, typeof(IList).GetProperties()[0], new[] { Expression.PostIncrementAssign(i) }); if (src.IsClass) { safe_cast = Expression.TypeAs(safe_cast, src); } else { safe_cast = Expression.Convert(safe_cast, src); } Expression equals = (src.IsClass ? Expression.Equal(p__src, Expression.Constant(null)) : (Expression)Expression.Constant(false)); ParameterExpression ss = Expression.Variable(typeof(IList), "ss"); Expression <Func <IList, IList, IList> > ee = Expression.Lambda <Func <IList, IList, IList> >(Expression.Block( new[] { i, len }, Expression.Assign(len, Expression.Property(s, typeof(ICollection).GetProperty("Count"))), Expression.Assign(i, Expression.Constant(0)), Expression.Loop(Expression. IfThenElse(Expression.GreaterThanOrEqual(i, len), Expression.Break(@break, i), Expression.Block( new[] { p__src, p__desc }, Expression.Assign(p__src, safe_cast), Expression.IfThenElse(equals, Expression.Block( Expression.Call(n, typeof(IList).GetMethod("Add"), desc.IsClass ? (Expression)Expression.Constant(null) : Expression.Default(desc)), Expression.MakeGoto(GotoExpressionKind.Continue, @continue, null, null) ), Expression.Block( ls.ToArray() ) ) ) ), @break, @continue ), n ), new[] { s, n }); return(ee.Compile()); }