Как получить доступ к объекту, тип которого определен во время выполнения? - PullRequest
2 голосов
/ 11 февраля 2010

Я использую FileHelpers для анализа файлов CSV, структура которых неизвестна, с использованием следующего кода:

            string cd = string.Format(@"[DelimitedRecord(""{0}"")]
                                        public sealed class ImportClass {{
                                            [FieldQuoted('{1}')]
                                            public string[] Fields;
                                        }}", _delimiter, _quote);
            Type t = DelimitedClassBuilder.ClassFromString(cd);

            var engine = new FileHelperAsyncEngine(t);

            engine.BeginReadFile(filename);
            object record;
            while ((record = engine.ReadNext()) != null) {

            }

            engine.Close();

Кажется, это работает просто отлично. Когда я делаю это через отладчик, запись является объектом типа ImportClass, и поле Fields правильно заполнено данными из файла.

У меня проблема в том, как мне на самом деле извлечь эти данные? Я не могу привести запись к ImportClass, так как этот тип не известен во время компиляции. Мне действительно нужно использовать отражение или есть более простой способ сделать это?

Ответы [ 3 ]

1 голос
/ 11 февраля 2010

Честно говоря, самый простой способ, которым я могу придумать, это использовать IronPython. Создайте строку кода и передайте ей движок Python. Мы заменили тонну отражений на DLR и IronPython.

Или, как вы говорите, вы можете размышлять.

Редактировать: Для отражения комментариев: Вам нужно только включить 2 железные сборки Python в качестве ссылок. Это не так сложно. Честно. Речь идет не об установке лодки и других вещей.

0 голосов
/ 11 февраля 2010

объявите класс в вашем коде.нет необходимости использовать отражение здесь.

0 голосов
/ 11 февраля 2010

Вероятно, есть чистый способ сделать это, используя библиотеку, которую вы используете. Тем не менее, вот общий ответ с использованием Reflection:

Type t = ...  // You already have this
PropertyInfo fieldsProperty = t.GetProperty("Fields",
    BindingFlags.Public | BindingFlags.Instance);
string[] fields = (string[])fieldsProperty.GetValue(record, null);

Edit:

Похоже, что в этой библиотеке есть методы, которые позволяют вместо этого читать файл в DataTable, и это, кажется, их рекомендуемый подход. Пример, показанный на этой странице :

DataTable dt = engine.ReadFileAsDT("test.txt"); 

Возможно, это проще и быстрее, чем с помощью Reflection.

...