Создать объект анонимного типа из произвольного текстового файла - PullRequest
1 голос
/ 04 мая 2010

Мне нужен разумный способ рисовать произвольные текстовые файлы в программе на C # и создавать объект произвольного анонимного типа или, возможно, какой-то составной словарь.

У меня есть типичный текстовый файл, который выглядит следующим образом:

adapter 1: LPe11002
  Factory IEEE: 10000000 C97A83FC
  Non-Volatile WWPN: 10000000 C93D6A8A , WWNN: 20000000 C93D6A8A
adapter 2: LPe11002
  Factory IEEE: 10000000 C97A83FD
  Non-Volatile WWPN: 10000000 C93D6A8B , WWNN: 20000000 C93D6A8B

Есть ли способ получить эту информацию в объекте анонимного типа или в какой-либо подобной структуре?

Последний анонимный тип мог бы выглядеть примерно так, если бы он был составлен в C # вручную:

new
{
    adapter1 = new 
    { 
        FactoryIEEE = "10000000 C97A83FC",
        Non-VolatileWWPN = "10000000 C93D6A8A",
        WWNN = "20000000 C93D6A8A"
    }
    adapter2 = new 
    { 
        FactoryIEEE = "10000000 C97A83FD",
        Non-VolatileWWPN = "10000000 C93D6A8B",
        WWNN = "20000000 C93D6A8B"
    }
}

Обратите внимание, что, поскольку содержимое текстового файла произвольно (т. Е. Ключи могут быть что угодно ), специализированное решение (например, которое ищет имена типа "FactoryIEEE") не будет работать. Однако структура файла всегда будет одинаковой (то есть отступы для групп, двоеточий и запятых в качестве разделителей и т. Д.).

Или, может быть, я поступаю неправильно, и у вас есть идея получше?

Ответы [ 4 ]

4 голосов
/ 04 мая 2010

Проверьте эту статью из 2 частей. Он быстро разбирает XML-файлы. Я думаю, он может быть адаптирован для анализа ваших текстовых файлов.

Он использует динамическую типизацию C # 4, чтобы делать то, что вы хотите.

4 голосов
/ 04 мая 2010

Вы идете об этом неправильно. Ваши данные "объекта анонимного типа" трудно построить и трудно использовать . Чтобы построить это, вы должны будете использовать хитрость отражения. И для чего?

Рассмотрим функцию PrintReport. Эта функция не станет проще из-за использования ATO. Отнюдь не так, что все будет сложнее и медленнее, если использовать само отражение для перебора ключей. Ваше решение могло бы иметь смысл, если было небольшое фиксированное количество возможных ключей. Тогда синтаксис использования, такой как "obj.FactoryIEEE", мог бы быть предпочтительным.

Я бы поступил так с List<Dictionary<string, string>> или, скажем, List<AdapterRecord>, где AdapterRecord равен

class AdapterRecord
{
    public string Name { get; set; }
    public Dictionary<string, string> Parameters { get; set; }
}
2 голосов
/ 04 мая 2010

Похоже, что это невозможно сделать даже в C # 4.

Кроме того, подумать об этом, если вы не знаете, какими будут ключи, тогда любой тип строго типизированного доступа будет непростым, и простая вставка split + в словарь / список / и т.д. будет иметь больше смысла.

1 голос
/ 04 мая 2010

Хотя я их не люблю, возможно, DataTable будет служить ...

...