public virtual int SizeOf(IType type)
{
if (type.IsPointer)
type = type.ElementType;
if (null == type || !type.IsValueType)
return 0;
var et = type as ExternalType;
if (null != et)
return Marshal.SizeOf(et.ActualType);
int size = 0;
var it = type as InternalClass;
if (null == it)
return 0;
//FIXME: TODO: warning if no predefined size => StructLayoutAttribute
foreach (Field f in it.TypeDefinition.Members.OfType<Field>())
{
int fsize = SizeOf(f.Type.Entity as IType);
if (0 == fsize)
return 0; //cannot be unmanaged
size += fsize;
}
return size;
}