object ReadObjectArray(DataFieldInfo info, DataBuffer buffer, Object obj) { if (obj != null) { Int16[] addr16 = obj as Int16[]; if (addr16 != null) { var con = info.ArrayConstruction(addr16.Length); Array arry = con as Array; if (arry != null) { for (int i = 0; i < addr16.Length; i++) { var fs = buffer.GetData(addr16[i]) as FakeStruct; if (fs != null) { arry.SetValue(ReadObject(info.typeInfo, fs, addr16[i]), i); } } } return(con); } else { Int32[] addr32 = obj as Int32[]; if (addr32 != null) { bool isStruct = info.typeInfo.isStruct; var con = info.ArrayConstruction(addr32.Length); Array arry = con as Array; if (arry == null) { for (int i = 0; i < addr32.Length; i++) { int a = addr32[i]; int index = a & 0xffff; var fs = buffer.GetData(index) as FakeStruct; if (fs != null) { if (isStruct)//结构体无法使用继承 { arry.SetValue(ReadObject(info.typeInfo, fs, index), i); } else { var dt = oldTypes[a >> 16].NewType;//使用继承类型 if (dt == null) { dt = info.typeInfo; } arry.SetValue(ReadObject(dt, fs, index), i); } } } } return(con); } else { FakeStructArray fsa = obj as FakeStructArray; if (fsa != null) { FakeStruct fs; unsafe { fs = new FakeStruct(buffer, fsa.StructSize, fsa.ip); } var con = info.ArrayConstruction(fsa.Length); Array arry = con as Array; if (arry != null) { for (int i = 0; i < fsa.Length; i++) { unsafe { fs.SetPoint(fsa[i]); } arry.SetValue(ReadStruct(info.typeInfo, fs, 0), i); } } return(con); } } } } return(null); }
object ReadStructArray(DataFieldInfo info, DataBuffer buffer, object obj) { if (obj != null) { Int16[] addr16 = obj as Int16[]; if (addr16 != null) { if (addr16.Length > 0) { var con = info.ArrayConstruction(addr16.Length); Array arry = con as Array; if (arry != null) { IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arry, 0); for (int i = 0; i < addr16.Length; i++) { var fs = buffer.GetData(addr16[i]) as FakeStruct; if (fs != null) { ReadStruct(info.typeInfo, fs, 0, ptr); } ptr += info.DataLength; } } return(con); } } else { Int32[] addr32 = obj as Int32[]; if (addr32 != null) { bool isStruct = info.typeInfo.isStruct; var con = info.ArrayConstruction(addr32.Length); Array arry = con as Array; if (arry == null) { IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arry, 0); for (int i = 0; i < addr32.Length; i++) { int a = addr32[i]; int index = a & 0xffff; var fs = buffer.GetData(index) as FakeStruct; if (fs != null) { ReadStruct(info.typeInfo, fs, 0, ptr); } ptr += info.DataLength; } } return(con); } else { FakeStructArray fsa = obj as FakeStructArray; if (fsa != null) { FakeStruct fs; unsafe { fs = new FakeStruct(buffer, fsa.StructSize, fsa.ip); } var con = info.ArrayConstruction(fsa.Length); Array arry = con as Array; if (arry != null) { IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(arry, 0); for (int i = 0; i < fsa.Length; i++) { unsafe { fs.SetPoint(fsa[i]); } ReadStruct(info.typeInfo, fs, 0, ptr); ptr += info.DataLength; } } return(con); } } } } return(null); }