/// <summary> /// 在当前上下文中写入已知类型数据,并移动上下文写入游标索引。 /// </summary> /// <param name="context">当前字节序列上下文</param> /// <param name="writer">二进制写入器</param> /// <param name="dType">规范数据定义</param> /// <param name="objData">写入对象实例</param> /// <param name="isNetworkBytes">是否写入网络序</param> public static void WriteKnownTypeObject(StreamContext context, BinaryWriter writer, SpecDataType dType, object objData, bool isNetworkBytes) { Type clrType = dType.GetRuntimeType(); if (dType.Prototype == SpecDataPrototype.Native) { context.IncreasePosition(SpecData.CLRObjectWrite(clrType, writer, objData, isNetworkBytes)); } else { if (dType.Prototype == SpecDataPrototype.Array) { Type elementType = dType.GetElementType(); Array arrObj = (Array)objData; if (SpecDataType.IsNativeType(TypeCache.ToSimpleType(elementType))) { #region 写入基础数据类型数组 for (int i = 0, j = dType.ElementLength; i < j; i++) { context.IncreasePosition(SpecData.CLRObjectWrite(elementType, writer, arrObj.GetValue(i), isNetworkBytes)); } #endregion } else { for (int m = 0, n = dType.ElementLength; m < n; m++) { WriteKnownTypeObject(context, writer, dType.GetElementDataType(), arrObj.GetValue(m), isNetworkBytes); } } } else { #region 扩展写入 if (clrType.Equals(typeof(EnumContract))) { EnumContract enc = (EnumContract)dType.GetDefineInstance(); clrType = enc.GetBaseRuntimeType(); if (!objData.GetType().Equals(clrType)) { objData = enc.GetEnumUnderlyingValue(objData.ToString()); } context.IncreasePosition(SpecData.CLRObjectWrite(clrType, writer, objData, isNetworkBytes)); } else if (clrType.Equals(typeof(DataContract))) { DataContract dac = (DataContract)dType.GetDefineInstance(); WriteByContract(context, writer, (Dictionary <string, object>)objData, dac); } else { throw new SpecDataDefineException(string.Format("不能读取数据类型{0}!", clrType.FullName)); } #endregion } } }