internal static Attribute GetCustomAttribute(RuntimeType type)
{
if (!StructLayoutAttribute.IsDefined(type))
{
return(null);
}
int num = 0;
int size = 0;
LayoutKind layoutKind = LayoutKind.Auto;
TypeAttributes typeAttributes = type.Attributes & TypeAttributes.LayoutMask;
if (typeAttributes != TypeAttributes.NotPublic)
{
if (typeAttributes != TypeAttributes.SequentialLayout)
{
if (typeAttributes == TypeAttributes.ExplicitLayout)
{
layoutKind = LayoutKind.Explicit;
}
}
else
{
layoutKind = LayoutKind.Sequential;
}
}
else
{
layoutKind = LayoutKind.Auto;
}
CharSet charSet = CharSet.None;
typeAttributes = (type.Attributes & TypeAttributes.StringFormatMask);
if (typeAttributes != TypeAttributes.NotPublic)
{
if (typeAttributes != TypeAttributes.UnicodeClass)
{
if (typeAttributes == TypeAttributes.AutoClass)
{
charSet = CharSet.Auto;
}
}
else
{
charSet = CharSet.Unicode;
}
}
else
{
charSet = CharSet.Ansi;
}
type.GetRuntimeModule().MetadataImport.GetClassLayout(type.MetadataToken, out num, out size);
if (num == 0)
{
num = 8;
}
return(new StructLayoutAttribute(layoutKind, num, size, charSet));
}