C#使用反射获取不安全结构中的固定字段类型

Joe*_*Joe 11 c# reflection unsafe

我正在尝试使用一些固定字段来获取不安全结构的字段类型.固定字段FieldType不返回实际类型.

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct MyStruct
{
   public UInt32 Field1;
   public fixed sbyte Field2[10];
   public UInt64 Field3;
}

void Test() 
{
   var theStruct = new MyStruct();
   string output = "";
   foreach (FieldInfo fi in theStruct.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance))
   {
      output += fi.Name + ": " + fi.FieldType.ToString() + "\r\n";
   }

}
Run Code Online (Sandbox Code Playgroud)

输出:

字段1: System.UInt32

字段2: TestProjectNS.MyStruct+<Field2>e__FixedBuffer0

字段3: System.UInt64


我正在寻找Field2告诉我它sbyte而不是TestProjectNS.MyStruct+<Field2>e__FixedBuffer0

Mik*_*erg 6

固定大小缓冲区的基础类型可以通过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";
}
Run Code Online (Sandbox Code Playgroud)

或单场短版:

var type = typeof (MyStruct)
            .GetField("Field2")
            .GetCustomAttributes(typeof (FixedBufferAttribute), false)
            .Cast<FixedBufferAttribute>()
            .Single()
            .ElementType;
Run Code Online (Sandbox Code Playgroud)

作为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

真棒的问题!