public static IEnumerable <OffsetInfo> GetCompoundInfo(Type type, bool ieee = false) { //Type t = typeof(T); var strtype = H5T.copy(H5T.C_S1); int strsize = (int)H5T.get_size(strtype); int curSize = 0; List <OffsetInfo> offsets = new List <OffsetInfo>(); foreach (var x in type.GetFields()) { OffsetInfo oi = new OffsetInfo() { name = x.Name, type = x.FieldType, datatype = ieee ? GetDatatypeIEEE(x.FieldType) : GetDatatype(x.FieldType), size = x.FieldType == typeof(string) ? stringLength(x) : Marshal.SizeOf(x.FieldType), offset = 0 + curSize }; if (oi.datatype == H5T.C_S1) { strtype = H5T.copy(H5T.C_S1); H5T.set_size(strtype, new IntPtr(oi.size)); oi.datatype = strtype; } if (oi.datatype == H5T.STD_I64BE) { oi.size = oi.size * 2; } curSize = curSize + oi.size; offsets.Add(oi); } H5T.close(strtype); return(offsets); }
public static IEnumerable <OffsetInfo> GetCompoundInfo(Type type, bool ieee = false) { //Type t = typeof(T); var strtype = H5T.copy(H5T.C_S1); int strsize = (int)H5T.get_size(strtype); int curSize = 0; List <OffsetInfo> offsets = new List <OffsetInfo>(); foreach (var x in type.GetFields()) { var fldType = x.FieldType; OffsetInfo oi = new OffsetInfo() { name = x.Name, type = fldType, datatype = ieee ? GetDatatypeIEEE(fldType) : GetDatatype(fldType), size = fldType == typeof(string) ? StringLength(x) : Marshal.SizeOf(fldType), offset = 0 + curSize }; if (oi.datatype == H5T.C_S1) { strtype = H5T.copy(H5T.C_S1); H5T.set_size(strtype, new IntPtr(oi.size)); oi.datatype = strtype; } if (oi.datatype == H5T.STD_I64BE) { oi.size = oi.size * 2; } curSize = curSize + oi.size; offsets.Add(oi); } /* poging om ook properties te bewaren. * foreach (var x in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)) * { * bool saveProperty = false; * bool isNotPublic = x.PropertyType.Attributes != TypeAttributes.Public; * foreach (Attribute attr in Attribute.GetCustomAttributes(x)) * { * var legAttr = attr as Hdf5SaveAttribute; * var kind = legAttr?.SaveKind; * bool saveAndPrivateProp = isNotPublic && kind == Hdf5Save.Save; * bool doNotSaveProp = (kind == Hdf5Save.DoNotSave) ; * if (saveAndPrivateProp && !doNotSaveProp) * { * saveProperty = true; * continue; * } * * } * if (!saveProperty) * continue; * var propType = x.PropertyType; * OffsetInfo oi = new OffsetInfo() * { * name = x.Name, * type = propType, * datatype = ieee ? GetDatatypeIEEE(propType) : GetDatatype(propType), * size = propType == typeof(string) ? stringLength(x) : Marshal.SizeOf(propType), * offset = 0 + curSize * }; * if (oi.datatype == H5T.C_S1) * { * strtype = H5T.copy(H5T.C_S1); * H5T.set_size(strtype, new IntPtr(oi.size)); * oi.datatype = strtype; * } * if (oi.datatype == H5T.STD_I64BE) * oi.size = oi.size * 2; * curSize = curSize + oi.size; * * offsets.Add(oi); * }*/ H5T.close(strtype); return(offsets); }
public static IEnumerable <OffsetInfo> GetCompoundInfo(Type type, bool ieee = false) { //Type t = typeof(T); var strtype = H5T.copy(H5T.C_S1); int strsize = (int)H5T.get_size(strtype); int curSize = 0; List <OffsetInfo> offsets = new List <OffsetInfo>(); foreach (var x in type.GetFields()) { //var fldType = x.FieldType; //OffsetInfo oi = new OffsetInfo() //{ // name = x.Name, // type = fldType, // datatype = ieee ? GetDatatypeIEEE(fldType) : GetDatatype(fldType), // size = fldType == typeof(string) ? StringLength(x) : Marshal.SizeOf(fldType), // offset = 0 + curSize //}; var fldType = x.FieldType; var marshallAsAttribute = type.GetMember(x.Name).Select(m => m.GetCustomAttribute <MarshalAsAttribute>()).FirstOrDefault(); OffsetInfo oi = new OffsetInfo() { name = x.Name, type = fldType, datatype = !fldType.IsArray ? ieee ? GetDatatypeIEEE(fldType) : GetDatatype(fldType) : H5T.array_create(ieee ? GetDatatypeIEEE(fldType.GetElementType()) : GetDatatype(fldType.GetElementType()), (uint)fldType.GetArrayRank(), Enumerable.Range(0, fldType.GetArrayRank()).Select(i => (ulong)marshallAsAttribute.SizeConst).ToArray()), size = fldType == typeof(string) ? StringLength(x) : !fldType.IsArray ? Marshal.SizeOf(fldType) : Marshal.SizeOf(fldType.GetElementType()) * marshallAsAttribute.SizeConst, offset = 0 + curSize }; if (oi.datatype == H5T.C_S1) { strtype = H5T.copy(H5T.C_S1); H5T.set_size(strtype, new IntPtr(oi.size)); oi.datatype = strtype; } if (oi.datatype == H5T.STD_I64BE) { oi.size = oi.size * 2; } curSize = curSize + oi.size; offsets.Add(oi); } /* poging om ook properties te bewaren. * foreach (var x in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)) * { * bool saveProperty = false; * bool isNotPublic = x.PropertyType.Attributes != TypeAttributes.Public; * foreach (Attribute attr in Attribute.GetCustomAttributes(x)) * { * var legAttr = attr as Hdf5SaveAttribute; * var kind = legAttr?.SaveKind; * bool saveAndPrivateProp = isNotPublic && kind == Hdf5Save.Save; * bool doNotSaveProp = (kind == Hdf5Save.DoNotSave) ; * if (saveAndPrivateProp && !doNotSaveProp) * { * saveProperty = true; * continue; * } * * } * if (!saveProperty) * continue; * var propType = x.PropertyType; * OffsetInfo oi = new OffsetInfo() * { * name = x.Name, * type = propType, * datatype = ieee ? GetDatatypeIEEE(propType) : GetDatatype(propType), * size = propType == typeof(string) ? stringLength(x) : Marshal.SizeOf(propType), * offset = 0 + curSize * }; * if (oi.datatype == H5T.C_S1) * { * strtype = H5T.copy(H5T.C_S1); * H5T.set_size(strtype, new IntPtr(oi.size)); * oi.datatype = strtype; * } * if (oi.datatype == H5T.STD_I64BE) * oi.size = oi.size * 2; * curSize = curSize + oi.size; * * offsets.Add(oi); * }*/ H5T.close(strtype); return(offsets); }