代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

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

  •  2
  • Ferruccio  · 技术社区  · 15 年前

    我使用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类型的对象,字段字段正确地填充了来自文件的数据。

    我所面临的问题是,如何实际提取这些数据?我无法将记录强制转换为importClass,因为编译时不知道该类型。我真的需要使用反射还是有更简单的方法?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Aaronaught    15 年前

    可能有一种干净的方法可以做到这一点,这是你正在使用的库所公开的。然而,这里有一个使用反射的一般答案:

    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"); 
    

    这可能比使用反射更简单、更快。

        2
  •  1
  •   Preet Sangha    15 年前

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

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

    编辑:反映评论: 您只需要包含2个Iron Python程序集作为引用。不难。说真的?这不是安装一艘船装载其他东西。

        3
  •  0
  •   Adeel    15 年前

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