static int SizeOfStruct(Type type) { int totalSize = 0; foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { if (field.GetCustomAttribute <IgnoreFieldAttribute>() != null) { continue; } int fieldSize = -1; FieldSizeAttribute fieldSizeAttr = field.GetCustomAttribute <FieldSizeAttribute>(); if (fieldSizeAttr != null) { if (fieldSizeAttr.size <= 0) { throw new Exception("Invalid size: " + field); } else { fieldSize = fieldSizeAttr.size; } } totalSize += SizeOf(field.FieldType, fieldSize); } return(totalSize); }
public object readStruct(Type type) { object obj = Activator.CreateInstance(type); foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (field.GetCustomAttribute <IgnoreFieldAttribute>() != null) { continue; } int fieldSize = -1; FieldSizeAttribute fieldSizeAttr = field.GetCustomAttribute <FieldSizeAttribute>(); if (fieldSizeAttr != null) { if (fieldSizeAttr.name != null) { fieldSize = GetFieldIntValue(obj, fieldSizeAttr.name); } else { fieldSize = fieldSizeAttr.size; } } object value = readType(field.FieldType, fieldSize); field.SetValue(obj, value); } return(obj); }