将结构转换为对象数组

时间:2011-05-02 20:59:26

标签: c# reflection

我正在二进制文件中读取设置为StructLayout(LayoutKind.Explicit)的结构。我需要将此数据移动到结构为Object[]的DAO中。而不是手动键入结构中的40个左右的字段,我只想使用反射并转换所有不以“未知”开头的元素。这是我到目前为止所拥有的。

[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
struct ClientOld : IStuctToArray
{
    [FieldOffset(0)]
    public byte Active;

    [FieldOffset(1)]
    [MarshalAs(UnmanagedType.AnsiBStr)]
    public string Title;

    [FieldOffset(10)]
    [MarshalAs(UnmanagedType.AnsiBStr)]
    public string LastName;

    [FieldOffset(36)]
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
    public byte[] Unknown1;

    (...)

    [FieldOffset(368)]
    [MarshalAs(UnmanagedType.AnsiBStr)]
    public string AddedBy;

    [FieldOffset(372)]
    [MarshalAs(UnmanagedType.LPArray, SizeConst = 22)]
    public byte[] Unknown7;

    public object[] ToObjectArray()
    {
        return this.GetType().GetFields()
                   .Where(a => !a.Name.StartsWith("Unknown"))
                   .Select(b => /* This is where I am stuck */)
                   .ToArray();
    }
}

我不知道在选择区域放什么来获取我的字段的值。 b.GetValue要求您传入一个对象,我不知道要传递什么对象。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

使用GetValue方法并传递您需要该值的对象,即this

    return this.GetType().GetFields()
               .Where(f => !f.Name.StartsWith("Unknown"))
               .Select(f => f.GetValue(this))
               .ToArray();