コード例 #1
0
        protected virtual string GenerateCode(object instance)
        {
            _layouter.Append(GetHeader());
            _layouter.AppendFormat(GetClassDefinition(), _mappedClass.FullName.Replace('.', '_').Replace("+", "__"), _mappedClass.FullName);

            _layouter.Begin();
            _layouter.Begin();
            _layouter.AppendFormat("{0} instance = new {0}();", _mappedClass.FullName);
            _layouter.Append("reader.AddReference(instance);");

            Type   type = instance.GetType();
            string key  = _reader.ReadString();

            _layouter.Append("byte typeCode = 0;");
            _layouter.Append("string key = null;");
            for (byte typeCode = _reader.ReadByte(); typeCode != AMF0TypeCode.EndOfObject; typeCode = _reader.ReadByte())
            {
                _layouter.Append("key = reader.ReadString();");
                _layouter.Append("typeCode = reader.ReadByte();");

                object value = _reader.ReadData(typeCode);
                _reader.SetMember(instance, key, value);
                MemberInfo[] memberInfos = type.GetMember(key);
                if (memberInfos != null && memberInfos.Length > 0)
                {
                    GeneratePropertySet(memberInfos[0]);
                }
                else
                {
                    //Log this error (do not throw exception), otherwise our current AMF stream becomes unreliable
#if LOGGING
                    log.Warn(__Res.GetString(__Res.Optimizer_Warning));
#endif
                    string msg = __Res.GetString(__Res.Reflection_MemberNotFound, string.Format("{0}.{1}", _mappedClass.FullName, key));
#if LOGGING
                    log.Warn(msg);
#endif
                    _layouter.AppendFormat("//{0}", msg);
                    _layouter.Append("reader.ReadData(typeCode);");
                }
                key = _reader.ReadString();
            }
            _layouter.Append("key = reader.ReadString();");
            _layouter.Append("typeCode = reader.ReadByte();");
            _layouter.Append("if( typeCode != AMF0TypeCode.EndOfObject ) throw new UnexpectedAMF();");

            _layouter.Append("return instance;");
            _layouter.End();
            _layouter.Append("}");
            _layouter.End();
            _layouter.Append("}");             // Close class
            _layouter.Append("}");             // Close namespace
            return(_layouter.ToString());
        }