如何访问在运行时定义类型的对象?

时间:2010-02-11 04:47:04

标签: c# reflection filehelpers

我正在使用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();

这似乎工作得很好。当我使用调试器逐步执行它时,record是ImportClass类型的对象,Fields字段正确地填充了文件中的数据。

我遇到的问题是如何实际提取数据?我无法将记录转换为ImportClass,因为在编译时不知道该类型。我真的需要使用反射还是有更简单的方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

老实说,我能想到的最简单的方法就是使用IronPython。构造代码字符串并将其传递给python引擎。我们用DLR和IronPython取代了一吨反射。

或者正如你所说,你可以反思。

编辑:反映意见: 您只需要包含2个铁蟒蛇组件作为参考。这并不难。老实说。它不是关于安装船装其他东西。

答案 1 :(得分:0)

您正在使用的库可能有一种干净的方式。然而,这是使用反射的一般答案:

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

编辑:

此库似乎有一些方法可以让您将文件读入DataTable,这似乎是他们推荐的方法。 this page上显示的示例是:

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

这可能比使用Reflection更简单,更快。

答案 2 :(得分:0)

在代码中声明类。这里不需要使用反射。