private void WriteClass(Stream stream, object classobj, ulong pos) { stream.Position = (long)pos; foreach (var i in classobj.GetType().GetFields()) { VersionAttribute versionAttribute = null; if (Attribute.IsDefined(i, typeof(VersionAttribute))) { versionAttribute = (VersionAttribute)Attribute.GetCustomAttribute(i, typeof(VersionAttribute)); } if (versionAttribute != null) { if (version < versionAttribute.Min || version > versionAttribute.Max) { continue; } } var bytes = GetBytes(i.GetValue(classobj)); stream.Write(bytes, 0, bytes.Length); } }
public void WriteClass <T>(Stream stream, ref T obj, long addedlen) where T : new() { var type = typeof(T); if (type.IsPrimitive) { object objk2 = obj; //long.Parse(obj.ToString()) + addedlen; switch (type.Name) { case "Int32": objk2 = int.Parse(obj.ToString()) + (int)addedlen; break; case "UInt32": objk2 = uint.Parse(obj.ToString()) + (uint)addedlen; break; case "Int16": objk2 = short.Parse(obj.ToString()) + (short)addedlen; break; case "UInt16": objk2 = ushort.Parse(obj.ToString()) + (ushort)addedlen; break; case "Byte": objk2 = byte.Parse(obj.ToString()) + (byte)addedlen; break; case "Int64" when is32Bit: objk2 = int.Parse(obj.ToString()) + (int)addedlen; break; case "Int64": objk2 = long.Parse(obj.ToString()) + (long)addedlen; break; case "UInt64" when is32Bit: objk2 = uint.Parse(obj.ToString()) + (uint)addedlen; break; case "UInt64": objk2 = ulong.Parse(obj.ToString()) + (ulong)addedlen; break; default: break; } var bytes = GetBytes(obj); stream.Write(bytes, 0, bytes.Length); } else { var t = obj; foreach (var i in t.GetType().GetFields()) { VersionAttribute versionAttribute = null; { if (Attribute.IsDefined(i, typeof(VersionAttribute))) { versionAttribute = (VersionAttribute)Attribute.GetCustomAttribute(i, typeof(VersionAttribute)); } } if (versionAttribute != null) { if (version < versionAttribute.Min || version > versionAttribute.Max) { continue; } } switch (i.GetValue(obj).GetType().Name) { case "Int32": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToInt32(i.GetValue(obj)) + (int)addedlen); } break; case "UInt32": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToUInt32(i.GetValue(obj)) + (uint)addedlen); } break; case "Int16": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToInt16(i.GetValue(obj)) + (short)addedlen); } break; case "UInt16": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToUInt16(i.GetValue(obj)) + (ushort)addedlen); } break; case "Byte": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToByte(i.GetValue(obj)) + (byte)addedlen); } break; case "Int64" when is32Bit: if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToInt32(i.GetValue(obj)) + (int)addedlen); } break; case "Int64": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToInt64(i.GetValue(obj)) + (long)addedlen); } break; case "UInt64" when is32Bit: if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToUInt32(i.GetValue(obj)) + (uint)addedlen); } break; case "UInt64": if (!Attribute.IsDefined(i, typeof(OffsetAttribute))) { break; } if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset) { i.SetValue(obj, Convert.ToUInt64(i.GetValue(obj)) + (ulong)addedlen); } break; default: break; } if (i.FieldType.IsPrimitive) { var bytes = GetBytes(i.GetValue(obj)); stream.Write(bytes, 0, bytes.Length); } else { break; } } obj = t; } }