Esempio n. 1
0
        /// <summary>
        /// 字典分配方法,将字典拆分处理,例如,IDictionary<TKey,TValue>或Dictionary<TKey,TValue>
        /// </summary>
        /// <param name="type"></param>
        public void DictionaryRouter(Type type)
        {
            BuilderInfo typeInfo = new BuilderInfo();

            typeInfo.Type          = type;
            typeInfo.TypeName      = NameReverser.GetName(type);
            typeInfo.AvailableName = AvailableNameReverser.GetName(type);


            if (!type.IsGenericType)
            {
                Type[] args = type.GetGenericArguments();
                EntityHandler(args[0]);
                EntityHandler(args[1]);
            }


            if (type.IsInterface)
            {
                IDictionaryHandler(typeInfo);
            }
            else
            {
                DictionaryHandler(typeInfo);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 返回初始化委托
 /// </summary>
 /// <param name="type">类型</param>
 /// <returns></returns>
 public static Delegate NewDelegate(Type type)
 {
     return(FastMethodOperator.New
            .MethodBody($@"return new {NameReverser.GetName(type)}();")
            .Return(type)
            .Complie());
 }
Esempio n. 3
0
        /// <summary>
        /// 根据参数反射信息反解参数定义
        /// </summary>
        /// <param name="parameterInfo">参数反射信息</param>
        /// <returns></returns>
        public static string GetParametersDeclaration(ParameterInfo parameterInfo)
        {
            //前缀
            string Prefix = string.Empty;


            //反解类名
            string result = NameReverser.GetName(parameterInfo.ParameterType);


            //特殊处理
            if (parameterInfo.ParameterType.Name.EndsWith("&"))
            {
                if (parameterInfo.IsIn)
                {
                    Prefix = "in ";
                }
                else if (parameterInfo.IsOut)
                {
                    Prefix = "out ";
                }
                else
                {
                    Prefix = "ref ";
                }
                return($"{Prefix}{result} {parameterInfo.Name}");
            }
            else
            {
                return($"{result} {parameterInfo.Name}");
            }
        }
Esempio n. 4
0
 /// <summary>
 /// 定义一个字段
 /// </summary>
 /// <param name="access"></param>
 /// <param name="type"></param>
 /// <param name="name"></param>
 /// <returns></returns>
 public T Field(string access, Type type, string name)
 {
     Using(type);
     if (!_fieldsSet.Contains(name))
     {
         FieldScript.Append($"{access} {NameReverser.GetName(type)} {name};");
     }
     return(Link);
 }
Esempio n. 5
0
 public T Inheritance(Type type)
 {
     if (type == null)
     {
         return(Link);
     }
     UsingRecoder.Add(type);
     return(Inheritance(NameReverser.GetName(type)));
 }
Esempio n. 6
0
        /// <summary>
        /// 一次性类型分配方法
        /// </summary>
        /// <param name="type"></param>
        public void OnceTypeRouter(Type type)
        {
            BuilderInfo typeInfo = new BuilderInfo();

            typeInfo.Type          = type;
            typeInfo.TypeName      = NameReverser.GetName(type);
            typeInfo.AvailableName = AvailableNameReverser.GetName(type);
            OnceTypeHandler(typeInfo);
        }
Esempio n. 7
0
 public T Return(Type type = null)
 {
     if (type == null)
     {
         type = typeof(void);
     }
     ReturnType = type;
     if (type.IsGenericType)
     {
         UsingRecoder.Add(GenericTypeOperator.GetTypes(type));
     }
     UsingRecoder.Add(type);
     ReturnScript = NameReverser.GetName(type) + " ";
     return(Link);
 }
Esempio n. 8
0
        /// <summary>
        /// 数组分配方法,数组类型会被拆分,例如:class[]或者int[]
        /// </summary>
        /// <param name="type"></param>
        public void ArrayRouter(Type type)
        {
            Type        eleType  = type.GetElementType();
            BuilderInfo typeInfo = new BuilderInfo();

            typeInfo.RealType      = type;
            typeInfo.Type          = eleType;
            typeInfo.TypeName      = NameReverser.GetName(eleType);
            typeInfo.AvailableName = AvailableNameReverser.GetName(type);
            if (IsOnceType(eleType))
            {
                //普通类型处理
                ArrayOnceTypeHandler(typeInfo);
            }
            else
            {
                //复杂类型交由入口处理
                EntityHandler(eleType);
                ArrayEntityHandler(typeInfo);
            }
        }
Esempio n. 9
0
        public static Func <T> NewDelegate <T>(Type type = null)
        {
            var builder = FastMethodOperator.New;

            if (type == null)
            {
                //直接使用T的类型作为初始化类型
                type = typeof(T);
            }
            else
            {
                //T为object,那么自动加载type的命名空间
                builder.Using(type);
            }


            //返回构建委托
            return(builder
                   .Using <T>()
                   .MethodBody($@"return new {NameReverser.GetName(type)}();")
                   .Return <T>()
                   .Complie <Func <T> >());
        }
Esempio n. 10
0
        public static string GetParameters(IEnumerable <KeyValuePair <Type, string> > list)
        {
            StringBuilder result = new StringBuilder();

            result.Append('(');
            if (list != null)
            {
                int i = 0;
                foreach (var item in list)
                {
                    if (i > 0)
                    {
                        result.Append(',');
                    }

                    result.Append(NameReverser.GetName(item.Key));
                    result.Append(' ');
                    result.Append(item.Value);
                    i += 1;
                }
            }
            result.Append(')');
            return(result.ToString());
        }
Esempio n. 11
0
 public T ClassName(Type type)
 {
     NameScript = NameReverser.GetName(type);
     return(Link);
 }
Esempio n. 12
0
 public T MethodName(Type type)
 {
     MethodNameScript = NameReverser.GetName(type);
     return(Link);
 }
Esempio n. 13
0
 /// <summary>
 /// 根据字段反射信息反解字段定义
 /// </summary>
 /// <param name="reflectFieldInfo">字段反射信息</param>
 /// <returns></returns>
 public static string GetFieldDeclaration(FieldInfo reflectFieldInfo)
 {
     return(NameReverser.GetName(reflectFieldInfo.FieldType) + " " + reflectFieldInfo.Name);
 }
Esempio n. 14
0
        /// <summary>
        /// 实体分配方法,会遍历实体类中的所有成员,不包括方法
        /// </summary>
        /// <param name="type"></param>
        public void EntityRouter(Type type)
        {
            BuilderInfo typeInfo = new BuilderInfo();

            typeInfo.RealType      = type;
            typeInfo.TypeName      = NameReverser.GetName(type);
            typeInfo.AvailableName = AvailableNameReverser.GetName(type);


            EntityStartHandler(typeInfo);


            //字段克隆
            var fields = type.GetFields();

            for (int i = 0; i < fields.Length; i++)
            {
                var fieldInfo = fields[i];
                //排除不能操作的类型
                if (!fieldInfo.IsStatic && !fieldInfo.IsInitOnly)
                {
                    Type fieldType = fieldInfo.FieldType;
                    if (IsOnceType(fieldType))       //普通字段
                    {
                        BuilderInfo info = new BuilderInfo();
                        info.MemberName    = fieldInfo.Name;
                        info.Type          = fieldType;
                        info.TypeName      = NameReverser.GetName(fieldType);
                        info.AvailableName = AvailableNameReverser.GetName(fieldType);
                        FieldOnceTypeHandler(info);
                    }
                    else if (fieldType.IsArray)      //数组
                    {
                        Type        eleType = fieldType.GetElementType();
                        BuilderInfo info    = new BuilderInfo();
                        info.MemberName    = fieldInfo.Name;
                        info.RealType      = eleType;
                        info.Type          = eleType;
                        info.TypeName      = NameReverser.GetName(eleType);
                        info.AvailableName = AvailableNameReverser.GetName(fieldType);

                        if (IsOnceType(eleType))
                        {
                            FieldArrayOnceTypeHandler(info);
                        }
                        else
                        {
                            EntityHandler(eleType);
                            FieldArrayEntityHandler(info);
                        }
                    }
                    else if (!fieldType.IsNotPublic)
                    {
                        //检测集合
                        BuilderInfo info = new BuilderInfo();
                        info.MemberName    = fieldInfo.Name;
                        info.Type          = fieldType;
                        info.TypeName      = NameReverser.GetName(fieldType);
                        info.AvailableName = AvailableNameReverser.GetName(fieldType);


                        EntityHandler(fieldType);
                        if (fieldType.GetInterface("IEnumerable") != null)
                        {
                            if (fieldType.GetInterface("IDictionary") != null)
                            {
                                if (fieldType.IsInterface)
                                {
                                    FieldIDictionaryHandler(info);
                                }
                                else
                                {
                                    FieldDictionaryHandler(info);
                                }
                            }
                            else
                            {
                                if (fieldType.IsInterface)
                                {
                                    FieldICollectionHandler(info);
                                }
                                else
                                {
                                    FieldCollectionHandler(info);
                                }
                            }
                        }
                        else
                        {
                            FieldEntityHandler(info);
                        }
                    }
                }
            }

            //属性克隆
            var properties = type.GetProperties();

            for (int i = 0; i < properties.Length; i++)
            {
                var propertyInfo = properties[i];
                //排除不能操作的属性
                if (propertyInfo.CanRead && !propertyInfo.GetGetMethod(true).IsStatic)
                {
                    Type propertyType = propertyInfo.PropertyType;


                    if (IsOnceType(propertyType))               //普通属性
                    {
                        BuilderInfo info = new BuilderInfo();
                        info.MemberName    = propertyInfo.Name;
                        info.Type          = propertyType;
                        info.TypeName      = NameReverser.GetName(propertyType);
                        info.AvailableName = AvailableNameReverser.GetName(propertyType);
                        PropertyOnceTypeHandler(info);
                    }
                    else if (propertyType.IsArray)               //数组
                    {
                        Type        eleType = propertyType.GetElementType();
                        BuilderInfo info    = new BuilderInfo();
                        info.MemberName    = propertyInfo.Name;
                        info.RealType      = propertyType;
                        info.Type          = eleType;
                        info.TypeName      = NameReverser.GetName(eleType);
                        info.AvailableName = AvailableNameReverser.GetName(propertyType);

                        if (IsOnceType(eleType))
                        {
                            PropertyArrayOnceTypeHandler(info);
                        }
                        else
                        {
                            EntityHandler(eleType);
                            PropertyArrayEntityHandler(info);
                        }
                    }
                    else if (!propertyType.IsNotPublic)
                    {
                        //检测集合
                        BuilderInfo info = new BuilderInfo();
                        info.MemberName    = propertyInfo.Name;
                        info.Type          = propertyType;
                        info.TypeName      = NameReverser.GetName(propertyType);
                        info.AvailableName = AvailableNameReverser.GetName(propertyType);


                        EntityHandler(propertyType);


                        if (propertyType.GetInterface("IEnumerable") != null)
                        {
                            if (propertyType.GetInterface("IDictionary") != null)
                            {
                                if (propertyType.IsInterface)
                                {
                                    PropertyIDictionaryHandler(info);
                                }
                                else
                                {
                                    PropertyDictionaryHandler(info);
                                }
                            }
                            else
                            {
                                if (propertyType.IsInterface)
                                {
                                    PropertyICollectionHandler(info);
                                }
                                else
                                {
                                    PropertyCollectionHandler(info);
                                }
                            }
                        }
                        else
                        {
                            PropertyEntityHandler(info);
                        }
                    }
                }
            }

            EntityReturnHandler(typeInfo);
        }