Преобразовать структуру в массив объектов - PullRequest
1 голос
/ 03 мая 2011

Я читаю в двоичном файле в структуре с установленным StructLayout(LayoutKind.Explicit). Мне нужно переместить эти данные в DAO со структурой Object[]. Вместо того, чтобы вручную вводить каждое из 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 Ответ

2 голосов
/ 03 мая 2011

Используйте метод GetValue и передайте объект, для которого вам нужно значение, т.е. this:

    return this.GetType().GetFields()
               .Where(f => !f.Name.StartsWith("Unknown"))
               .Select(f => f.GetValue(this))
               .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...