2011-05-02 244 views
1

我正在讀取二進制文件中的結構集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要求你傳入一個對象,我不知道要傳遞什麼對象。

任何幫助將不勝感激。

回答

2

使用GetValue方法,並傳遞給到需要的值的對象,即this

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