コード例 #1
0
        Boolean TryWrite(Object target, DME_BinaryWriter writer, DME_MemberInfo member, Boolean encodeInt, Boolean allowNull)
        {
            Object value = member.GetValue(target);

            // 基本类型
            if (writer.WriteValue(value, encodeInt)) return true;

            // 允许空时,增加一个字节表示对象是否为空
            if (value == null)
            {
                if (allowNull) writer.Write((Byte)0);
                return true;
            }
            if (allowNull) writer.Write((Byte)1);

            // 接口支持
            //if (Array.IndexOf(member.Type.GetInterfaces(), typeof(IBinaryAccessor)) >= 0)
            if (typeof(DME_IBinaryAccessor).IsAssignableFrom(member.Type))
            {
                // 调用接口
                DME_IBinaryAccessor accessor = value as DME_IBinaryAccessor;
                accessor.Write(writer);
                return true;
            }

            #region 数组
            if (member.Type.IsArray)
            {
                // 特殊处理字节数组
                if (member.Type == typeof(Byte[]))
                {
                    writer.Write((Byte[])value);
                    return true;
                }

                Array arr = value as Array;
                if (arr != null)
                {

                }
            }
            #endregion

            #region 枚举
            if (typeof(IEnumerable).IsAssignableFrom(member.Type))
            {
                // 先写元素个数
                IEnumerable arr = value as IEnumerable;
                Int32 count = 0;
                foreach (Object item in arr)
                {
                    count++;
                }
                // 写入长度
                writer.WriteEncoded(count);

                foreach (Object item in arr)
                {
                    // 允许空时,增加一个字节表示对象是否为空
                    if (item == null)
                    {
                        if (allowNull) writer.Write((Byte)0);
                        continue;
                    }
                    if (allowNull) writer.Write((Byte)1);

                    if (!writer.WriteValue(item, encodeInt))
                        Write(item, writer, encodeInt, allowNull, member.Member.MemberType == MemberTypes.Property);
                }
                return true;
            }
            #endregion

            return false;
        }