【问题标题】:Generate class from datatable or database table从数据表或数据库表生成类
【发布时间】:2011-03-18 10:34:59
【问题描述】:

我有一个项目,客户可以在其中导入 excel 文件、csv 或制表符分隔的文件。该文件被加载到我将其转换为 SQLite 数据库表的数据表中。我真的更喜欢使用强类型对象和数据表,所以有没有办法使用反射轻松地将创建的数据库表转换为强类型类?关键是导入到应用程序中的文件总是不同的(即不同的列),所以我不能真正对任何强类型对象进行硬编码,它们总是必须动态生成。

【问题讨论】:

    标签: c# reflection code-generation


    【解决方案1】:

    如果可能的话,您可以使用 C# 4 的新 dynamic 功能。更具体地说,ExpandoObject Class

    ExpandoObject 表示一个对象,其成员可以 动态添加和删除 运行时间。

    您还有DynamicObject Class

    查看以下链接了解更多信息:

    Dynamic class creation

    Populating and Using Dynamic Classes in C#/.NET 4.0

    How do create a Dynamic class in C# 4?

    【讨论】:

      【解决方案2】:

      理论上,您可以使用 Reflection.Emit 之类的东西创建程序集,甚至可以通过生成代码文件并调用编译器将它们构建到程序集中。

      但是,我不确定这会有什么用处。假设这些表的架构是在运行时确定的,那么这些生成的类的任何使用都将无法使用您在不使用反射的情况下添加的这些强类型属性,此时您实际上是在处理一些弱类型的东西,增加了反射的性能。 C# 4.0 中的动态类型可能会消除对性能的影响,但您仍然会增加很多复杂性而没有真正的好处。

      【讨论】:

        【解决方案3】:

        Ryan 已经提出了正确的问题,我也只能同意强类型类的唯一好处是在设计或编译时,而不是在运行时。

        也许您想在创建 SQLlite 表后在另一个使用该表的应用程序中构建一些强类型类。

        在这种情况下,您可能可以查看T4 - Text Template Transformation Toolkit,因为它能够从查询中创建强类型类,以便您能够在编译时将这些类用于进一步的应用程序。

        但是在你开始使用它之前,你应该知道T4是best kept Visual Studio secrets之一。 ;-)

        【讨论】:

          猜你喜欢
          • 2011-08-17
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 2016-06-18
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多