Example #1
0
    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);
    }
Example #2
0
    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);
    }