2011-05-02 7 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();