Exemple #1
0
 public static bool IsNumber(object o)
 {
     if (o == null)
     {
         return(false);
     }
     if (o is TypeTool)
     {
         return(TypeTool.IsNumber(o.GetType()));
     }
     return(false);
 }
Exemple #2
0
 public static bool IsDateTime(object o)
 {
     if (o == null)
     {
         return(false);
     }
     if (o is TypeTool)
     {
         return(TypeTool.IsFloat(o.GetType()));
     }
     return(false);
 }
Exemple #3
0
 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);
 }
Exemple #4
0
        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);
        }
Exemple #5
0
 public static bool IsBasicType(Type type)
 {
     return(type == typeof(IPAddress) || TypeTool.IsDateTime(type) || TypeTool.IsNumber(type) ||
            TypeTool.IsString(type) || TypeTool.IsFloat(type));
 }
Exemple #6
0
 public static byte[] BinaryBy(ulong value)
 {
     return(TypeTool.BinaryBy(typeof(long), Convert.ToInt64(value), sizeof(ulong)));
 }
Exemple #7
0
        /// <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);
            }
        }
Exemple #8
0
        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());
        }