Базовый тип буфера фиксированного размера может быть получен через FixedBufferAttribute
, который применяется к оператору буфера фиксированного размера.
foreach (FieldInfo fi in typeof(MyStruct).GetFields(BindingFlags.Public | BindingFlags.Instance))
{
var attr = fi.GetCustomAttributes(typeof(FixedBufferAttribute), false);
if(attr.Length > 0)
output += fi.Name + ": " + ((FixedBufferAttribute)attr[0]).ElementType + "\r\n";
else
output += fi.Name + ": " + fi.FieldType + "\r\n";
}
Или короткая версия для одного поля:
var type = typeof (MyStruct)
.GetField("Field2")
.GetCustomAttributes(typeof (FixedBufferAttribute), false)
.Cast<FixedBufferAttribute>()
.Single()
.ElementType;
Как CodeInChaos, мне также нужно было отразить это, но у меня есть FixedBufferAttribute
:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyStruct
{
public uint Field1;
[FixedBuffer(typeof(sbyte), 10)]
public <Field2>e__FixedBuffer0 Field2;
public ulong Field3;
// Nested Types
[StructLayout(LayoutKind.Sequential, Size=10), CompilerGenerated, UnsafeValueType]
public struct <Field2>e__FixedBuffer0
{
public sbyte FixedElementField;
}
}
Удивительный вопрос!