public void init(CSWC swc)
        {
            this.swc  = swc;
            arrayType = typeof(Array);

            link_type = new Dictionary <Type, RunTimeDataType>();



            link_type.Add(typeof(int), RunTimeDataType.rt_int);
            link_type.Add(typeof(string), RunTimeDataType.rt_string);
            link_type.Add(typeof(double), RunTimeDataType.rt_number);
            link_type.Add(typeof(bool), RunTimeDataType.rt_boolean);
            link_type.Add(typeof(uint), RunTimeDataType.rt_uint);
            link_type.Add(typeof(ASBinCode.rtData.rtArray), RunTimeDataType.rt_array);
            link_type.Add(typeof(ASBinCode.rtData.rtFunction), RunTimeDataType.rt_function);
            link_type.Add(typeof(DictionaryKey), _DICT_KEY);
            link_type.Add(typeof(RunTimeValueBase), _OBJECT_LINK);
            link_type.Add(typeof(float), _FLOAT);
            link_type.Add(typeof(short), _SHORT);
            link_type.Add(typeof(ushort), _USHORT);

            foreach (var item in swc.creator_Class)
            {
                link_type.Add(item.Key.getLinkSystemObjType(), item.Value.getRtType());
                link_type.Add(new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()), item.Value.staticClass.getRtType());

                if (item.Key.getLinkSystemObjType().Equals(typeof(object)))
                {
                    _objectType_ = item.Value.getRtType();
                }
            }

            type_link = new Dictionary <RunTimeDataType, Type>();
            type_link.Add(RunTimeDataType.rt_int, typeof(int));
            type_link.Add(RunTimeDataType.rt_string, typeof(string));
            type_link.Add(RunTimeDataType.rt_number, typeof(double));
            type_link.Add(RunTimeDataType.rt_boolean, typeof(bool));
            type_link.Add(RunTimeDataType.rt_uint, typeof(uint));
            type_link.Add(RunTimeDataType.rt_array, typeof(ASBinCode.rtData.rtArray));
            type_link.Add(RunTimeDataType.rt_function, typeof(ASBinCode.rtData.rtFunction));
            type_link.Add(_DICT_KEY, typeof(DictionaryKey));
            type_link.Add(_OBJECT_LINK, typeof(RunTimeValueBase));
            type_link.Add(_FLOAT, typeof(float));
            type_link.Add(_SHORT, typeof(short));
            type_link.Add(_USHORT, typeof(ushort));

            foreach (var item in swc.creator_Class)
            {
                type_link.Add(item.Value.getRtType(), item.Key.getLinkSystemObjType());

                type_link.Add(item.Value.staticClass.getRtType(), new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()));
            }

            if (swc.TypeClass == null)
            {
                return;
            }

            {
                var clsint = swc.getClassDefinitionByName("int").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsint, typeof(int)), clsint);
                type_link.Add(clsint, new AS3Class_Type(clsint, typeof(int)));
            }
            {
                var clsuint = swc.getClassDefinitionByName("uint").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsuint, typeof(uint)), clsuint);
                type_link.Add(clsuint, new AS3Class_Type(clsuint, typeof(uint)));
            }
            {
                var clsstring = swc.getClassDefinitionByName("String").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsstring, typeof(string)), clsstring);
                type_link.Add(clsstring, new AS3Class_Type(clsstring, typeof(string)));
            }
            {
                var clsboolean = swc.getClassDefinitionByName("Boolean").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsboolean, typeof(bool)), clsboolean);
                type_link.Add(clsboolean, new AS3Class_Type(clsboolean, typeof(bool)));
            }
            {
                var clsnumber = swc.getClassDefinitionByName("Number").staticClass.getRtType();
                link_type.Add(new AS3Class_Type(clsnumber, typeof(double)), clsnumber);
                type_link.Add(clsnumber, new AS3Class_Type(clsnumber, typeof(double)));
            }
        }
        public string GetCode()
        {
            if (as3class.super.name == "Object")
            {
                StringBuilder content = new StringBuilder();

                foreach (var item in as3class.staticClass.fields)
                {
                    if (item.inheritFrom == null)
                    {
                        content.Append("\t\t");

                        string field = "";                        //item.isPublic ? "public" : (item.isInternal ? "internal" : "private");
                        //if (item.isProtectd) field += " protected";
                        //if (item.isConst) field += " const";

                        //field += " " + GetTypeString(item.valueType);

                        field += " " + GetName(item.name);
                        if (item.defaultValue != null)
                        {
                            field += " = " + item.defaultValue.ToString();
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Yellow;
                            Console.WriteLine("发现枚举字段没有默认值." + as3class.name + ":" + item.name);
                            Console.ResetColor();
                        }


                        field += ",";

                        content.AppendLine(field);
                    }
                }

                //Enum文档
                foreach (var item in as3class.fields)
                {
                    if (item.inheritFrom == null)
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine("发现枚举类中的非静态字段:" + as3class.name + ":" + item.name);
                        Console.ResetColor();
                    }
                }

                var tempate = Properties.Resources.EnumTemplate;
                tempate = tempate.Replace("[PACKAGE]", as3class.package)
                          .Replace("[CLASSNAME]", as3class.name)
                          .Replace("[CONTENT]", content.ToString());

                return(tempate.ToString());
            }
            else if (as3class.super.name == "Message")
            {
                var enumtype   = swc.getClassDefinitionByName("com.netease.protobuf.fieldDescriptors.FieldDescriptor_TYPE_ENUM");
                var repeatEnum = swc.getClassDefinitionByName("com.netease.protobuf.fieldDescriptors.RepeatedFieldDescriptor_TYPE_ENUM");
                //****查询元数据***
                foreach (var item in as3class.staticClass.classMembers)
                {
                    if (item.valueType == enumtype.getRtType())
                    {
                        var findenum   = ((ASBinCode.rtData.rtObject)player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".enumType")).value._class.instanceClass;
                        var bindmember = player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".name");

                        enumMembers.Add(bindmember.ToString(), findenum.package + (string.IsNullOrEmpty(findenum.package) ? "" : ".") + findenum.name);
                    }
                    else if (item.valueType == repeatEnum.getRtType())
                    {
                        var findenum   = ((ASBinCode.rtData.rtObject)player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".enumType")).value._class.instanceClass;
                        var bindmember = player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".name");

                        repeatEnumMembers.Add(bindmember.ToString(), findenum.package + (string.IsNullOrEmpty(findenum.package) ? "" : ".") + findenum.name);
                    }
                }

                StringBuilder content = new StringBuilder();

                List <ASBinCode.rtti.ClassMember> fieldlist    = new List <ASBinCode.rtti.ClassMember>();
                List <ASBinCode.rtti.ClassMember> propertylist = new List <ASBinCode.rtti.ClassMember>();

                foreach (var member in as3class.classMembers)
                {
                    if (member.inheritFrom != null && (member.inheritFrom.name != "Message" || member.inheritSrcMember.isConstructor))
                    {
                        continue;
                    }
                    if (member.isConstructor)
                    {
                        continue;
                    }

                    if (!member.isPublic)
                    {
                        continue;
                    }
                    if (member.isGetter || member.isSetter)
                    {
                        continue;
                    }
                    if (member.valueType == RunTimeDataType.rt_function)
                    {
                        if (member.inheritFrom != null)
                        {
                            continue;
                        }

                        var    function = swc.functions[((MethodGetterBase)member.bindField).functionId];
                        string type     = GetTypeString(function.signature.returnType);


                        string method = "\t\tpublic ";
                        if (member.isOverride)
                        {
                            method += "override ";
                        }

                        method += type + " ";
                        method += GetName(member.name);
                        method += "(";

                        for (int i = 0; i < function.signature.parameters.Count; i++)
                        {
                            var p = function.signature.parameters[i];

                            string paratype = GetTypeString(p.type);

                            if (paratype == "flash.utils.IDataInput")
                            {
                                paratype = "System.IO.MemoryStream";
                            }
                            else if (paratype == "flash.utils.IDataOutput")
                            {
                                paratype = "System.IO.MemoryStream";
                            }
                            else if (paratype == "flash.utils.ByteArray")
                            {
                                paratype = "byte[]";
                            }
                            else if (paratype == "com.netease.protobuf.UInt64")
                            {
                                paratype = "System.UInt64";
                            }
                            else if (paratype == "com.netease.protobuf.Int64")
                            {
                                paratype = "System.Int64";
                            }

                            method += paratype + " " + p.name;
                            if (i < function.signature.parameters.Count - 1)
                            {
                                method += ",";
                            }
                        }

                        method += "){";

                        method += " player.invokeMethod(as3Object, \"" + member.name + "\"";

                        for (int i = 0; i < function.signature.parameters.Count; i++)
                        {
                            method += "," + GetConvertToAS3ParameterFunctionName(function.signature.parameters[i].type) + "(" + function.signature.parameters[i].name + ")";
                        }

                        method += ");";
                        method += "}";



                        content.AppendLine(method);
                    }
                    else if (member.bindField is ASBinCode.ClassPropertyGetter)
                    {
                        string propertytype = GetTypeString(member.valueType);
                        if (propertytype == "flash.utils.ByteArray")
                        {
                            propertytype = "byte[]";
                        }
                        else if (propertytype == "com.netease.protobuf.UInt64")
                        {
                            propertytype = "System.UInt64";
                        }
                        else if (propertytype == "com.netease.protobuf.Int64")
                        {
                            propertytype = "System.Int64";
                        }

                        if ((propertytype == "byte[]") || (propertytype == "System.UInt64") || (propertytype == "System.Int64") || ((member.valueType < RunTimeDataType._OBJECT)))
                        {
                            bool isenum = false;
                            if (enumMembers.ContainsKey(member.name))
                            {
                                propertytype = enumMembers[member.name];
                                isenum       = true;
                            }

                            string filed = "\t\tpublic " + propertytype + " " + GetName(member.name) +
                                           "{";

                            ClassPropertyGetter prop = (ClassPropertyGetter)member.bindField;

                            if (prop.getter != null && prop.getter.classmember.isPublic)
                            {
                                filed += "get { return (" + propertytype + ")(" + GetConvertFromAS3ParameterFunctionName(member.valueType) + "(player.getMemberValue(as3Object, \"" + member.name + "\"))); }";
                            }

                            if (prop.setter != null && prop.setter.classmember.isPublic)
                            {
                                filed += "set { player.setMemberValue(as3Object, \"" + member.name + "\", " + GetConvertToAS3ParameterFunctionName(member.valueType) + (isenum?"(int)":"") + "(value)); }";
                            }

                            filed += "}";



                            content.AppendLine(filed);
                        }
                        else
                        {
                            string field = Properties.Resources.ClassPropertyTemplate
                                           .Replace("[PROPERTYTYPE]", propertytype)
                                           .Replace("[CNAME]", GetName(member.name))
                                           .Replace("[NAME]", member.name)
                            ;

                            content.AppendLine(field);
                            propertylist.Add(member);
                        }
                    }
                    else if (as3class.fields.Contains(member))
                    {
                        fieldlist.Add(member);

                        string fieldtype = GetTypeString(member.valueType);
                        if (fieldtype == "System.Collections.Generic.List<{0}>")
                        {
                            Field f = (Field)member.bindField;

                            foreach (var item in f.metas)
                            {
                                if (item.MetaName == "ArrayElementType")
                                {
                                    if (repeatEnumMembers.ContainsKey(member.name))
                                    {
                                        fieldtype = string.Format(fieldtype, repeatEnumMembers[member.name]);
                                    }
                                    else
                                    {
                                        fieldtype = string.Format(fieldtype, item.MetaData.ToString());
                                    }
                                    break;
                                }
                            }
                        }
                        else if (fieldtype == "flash.utils.ByteArray")
                        {
                            fieldtype = "byte[]";
                        }
                        else if (fieldtype == "com.netease.protobuf.UInt64")
                        {
                            fieldtype = "System.UInt64";
                        }
                        else if (fieldtype == "com.netease.protobuf.Int64")
                        {
                            fieldtype = "System.Int64";
                        }

                        if (enumMembers.ContainsKey(member.name))
                        {
                            fieldtype = enumMembers[member.name];
                        }

                        string field = "\t\tpublic " + fieldtype + " " + GetName(member.name) + " ;";

                        content.AppendLine(field);
                    }
                }

                string afterMergeFrom = string.Empty;
                string beforeWriteTo  = string.Empty;
                if (fieldlist.Count > 0)
                {
                    //***追加afterMergeFrom()

                    afterMergeFrom  = "\t\tprivate bool _isreadding;\n";
                    afterMergeFrom += "\t\tprotected override void afterMergeFrom()\n";
                    afterMergeFrom += "\t\t{\n";
                    afterMergeFrom += "\t\t\tif(_isreadding) { return;} else { _isreadding=true; }\n";
                    afterMergeFrom += "\t\t\ttry\n";
                    afterMergeFrom += "\t\t\t{\n";

                    for (int i = 0; i < fieldlist.Count; i++)
                    {
                        var    member    = fieldlist[i];
                        string fieldtype = GetTypeString(member.valueType);

                        if (fieldtype == "System.Collections.Generic.List<{0}>")
                        {
                            Field  f           = (Field)member.bindField;
                            string vectortype  = string.Empty;
                            string elementtype = string.Empty;
                            foreach (var item in f.metas)
                            {
                                if (item.MetaName == "ArrayElementType")
                                {
                                    vectortype = item.MetaData.ToString();

                                    if (repeatEnumMembers.ContainsKey(member.name))
                                    {
                                        fieldtype = string.Format(fieldtype, repeatEnumMembers[member.name]);
                                    }
                                    else
                                    {
                                        fieldtype = string.Format(fieldtype, item.MetaData.ToString());
                                    }
                                    elementtype = vectortype;
                                    if (repeatEnumMembers.ContainsKey(member.name))
                                    {
                                        elementtype = repeatEnumMembers[member.name];
                                    }


                                    if (elementtype == "flash.utils.ByteArray")
                                    {
                                        elementtype = "byte[]";
                                    }
                                    else if (elementtype == "com.netease.protobuf.UInt64")
                                    {
                                        elementtype = "System.UInt64";
                                    }
                                    else if (elementtype == "com.netease.protobuf.Int64")
                                    {
                                        elementtype = "System.Int64";
                                    }
                                    else if (elementtype == "Number")
                                    {
                                        elementtype = "double";
                                    }


                                    break;
                                }
                            }

                            string listtemplate =
                                @"			{
				[CNAME] = new [LIST]();
				uint len = (uint)player.getMemberValue(as3Object, ""[NAME].length"");
				for (int i = 0; i < len; i++)
				{
					[VECTORTYPE] v = default([VECTORTYPE]);
[SETVALUE]
					[CNAME].Add(v);
				}
			}
";

                            bool isclass = false;
                            var  c       = swc.getClassDefinitionByName(vectortype);
                            if (c != null)
                            {
                                RunTimeDataType primtype;
                                if (ASRuntime.TypeConverter.Object_CanImplicit_ToPrimitive(c, out primtype))
                                {
                                    isclass = false;
                                }
                                else
                                {
                                    isclass = true;
                                }
                            }

                            afterMergeFrom += listtemplate.Replace("[CNAME]", GetName(member.name))
                                              .Replace("[NAME]", member.name)
                                              .Replace("[VECTORTYPE]", elementtype)
                                              .Replace("[SETVALUE]", GetLoadFieldValueStmt("v", elementtype, member, isclass, "i", "\t\t"))
                                              .Replace("[LIST]", fieldtype)
                            ;



                            continue;
                        }
                        else if (fieldtype == "flash.utils.ByteArray")
                        {
                            fieldtype = "byte[]";
                        }
                        else if (fieldtype == "com.netease.protobuf.UInt64")
                        {
                            fieldtype = "System.UInt64";
                        }
                        else if (fieldtype == "com.netease.protobuf.Int64")
                        {
                            fieldtype = "System.Int64";
                        }

                        afterMergeFrom += GetLoadFieldValueStmt(GetName(member.name), fieldtype, member, member.valueType > RunTimeDataType._OBJECT, null);
                    }
                    afterMergeFrom += "\t\t\t}\n";
                    afterMergeFrom += "\t\t\tfinally\n";
                    afterMergeFrom += "\t\t\t{\n";
                    afterMergeFrom += "\t\t\t_isreadding=false;\n";
                    afterMergeFrom += "\t\t\t}\n";
                    afterMergeFrom += "\t\t}\n";



                    //****追加beforeWriteTo******

                    beforeWriteTo  = "\t\tprivate bool _iswritting;\n";
                    beforeWriteTo += "\t\tprotected override void beforeWriteTo()\n";
                    beforeWriteTo += "\t\t{\n";
                    beforeWriteTo += "\t\t\tif(_iswritting) { return;} else { _iswritting=true; }\n";
                    beforeWriteTo += "\t\t\ttry\n";
                    beforeWriteTo += "\t\t\t{\n";

                    for (int i = 0; i < fieldlist.Count; i++)
                    {
                        var    member    = fieldlist[i];
                        string fieldtype = GetTypeString(member.valueType);

                        if (fieldtype == "System.Collections.Generic.List<{0}>")
                        {
                            Field  f           = (Field)member.bindField;
                            string vectortype  = string.Empty;
                            string elementtype = string.Empty;
                            foreach (var item in f.metas)
                            {
                                if (item.MetaName == "ArrayElementType")
                                {
                                    vectortype = item.MetaData.ToString();
                                    fieldtype  = string.Format(fieldtype, item.MetaData.ToString());

                                    elementtype = vectortype;

                                    if (elementtype == "flash.utils.ByteArray")
                                    {
                                        elementtype = "byte[]";
                                    }
                                    else if (elementtype == "com.netease.protobuf.UInt64")
                                    {
                                        elementtype = "System.UInt64";
                                    }
                                    else if (elementtype == "com.netease.protobuf.Int64")
                                    {
                                        elementtype = "System.Int64";
                                    }
                                    else if (elementtype == "Number")
                                    {
                                        elementtype = "double";
                                    }

                                    break;
                                }
                            }

                            string listtemplate =
                                @"			{
				player.setMemberValue(as3Object, ""[CNAME].length"", [CNAME].Count);
				for (int i = 0; i < [CNAME].Count; i++)
				{
					var v = [CNAME][i];
[SAVEVALUE]					
				}
			}
";
                            bool isclass = false;
                            var  c       = swc.getClassDefinitionByName(vectortype);
                            if (c != null)
                            {
                                RunTimeDataType primtype;
                                if (ASRuntime.TypeConverter.Object_CanImplicit_ToPrimitive(c, out primtype))
                                {
                                    isclass = false;
                                }
                                else
                                {
                                    isclass = true;
                                }
                            }

                            beforeWriteTo += listtemplate.Replace("[CNAME]", GetName(member.name))
                                             .Replace("[SAVEVALUE]", GetSaveFieldValueStmt("v", elementtype, vectortype, member.name, isclass, "i", "\t\t"));
                            ;


                            continue;
                        }
                        else if (fieldtype == "flash.utils.ByteArray")
                        {
                            fieldtype = "byte[]";
                        }
                        else if (fieldtype == "com.netease.protobuf.UInt64")
                        {
                            fieldtype = "System.UInt64";
                        }
                        else if (fieldtype == "com.netease.protobuf.Int64")
                        {
                            fieldtype = "System.Int64";
                        }

                        beforeWriteTo += GetSaveFieldValueStmt(GetName(member.name), fieldtype, GetTypeString(member.valueType), member.name, member.valueType > RunTimeDataType._OBJECT, null);
                    }


                    for (int i = 0; i < propertylist.Count; i++)
                    {
                        var    member   = propertylist[i];
                        string template = Properties.Resources.ClassPropertyBeforeWriteTo;

                        beforeWriteTo += template.Replace("[CNAME]", GetName(member.name))
                                         .Replace("[NAME]", member.name)

                        ;
                    }



                    beforeWriteTo += "\t\t\t}\n";
                    beforeWriteTo += "\t\t\tfinally\n";
                    beforeWriteTo += "\t\t\t{\n";
                    beforeWriteTo += "\t\t\t_iswritting=false;\n";
                    beforeWriteTo += "\t\t\t}\n";
                    beforeWriteTo += "\t\t}\n";
                }



                var tempate = Properties.Resources.MessageTemplate;
                tempate = tempate.Replace("[PACKAGE]", as3class.package)
                          .Replace("[AS3PROTOTYPE]", as3class.package + (string.IsNullOrEmpty(as3class.package)?"":".") + as3class.name)
                          .Replace("[CLASSNAME]", as3class.name)
                          .Replace("[afterMergeFrom]", afterMergeFrom)
                          .Replace("[beforeWriteTo]", beforeWriteTo)
                          .Replace("[CONTENT]", content.ToString());

                return(tempate.ToString());
            }
            else
            {
                return(string.Empty);
            }
        }