开发者

Convert a struct to an object array

I am reading in a binary file in to a struct with StructLayout(LayoutKind.Explicit) set. I need to move this data in to a DAO which has the structure of Object[]. Instead of manually typing each of the 40 or so fields that are in the struct I would just like to use reflection and convert all of the elements not starting with "Unknown". Here is what I have so far.

[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();
    }
}

I do not know what to put in the select area to get the value of my field. b.GetValue requires you to pass in a object and I do not know what object to pass.

Any help would be greatly appreciated.


Use the GetValue method and pass the object for which you need the value, i.e. this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜