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();
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论