【问题标题】:Save and restore type (not object) created at runtime?保存和恢复在运行时创建的类型(不是对象)?
【发布时间】:2012-06-22 23:14:45
【问题描述】:

在我们的应用程序(C# - .NET 4.5)中,我们有一个报告生成工具。此工具必须仅接收 SQL 命令,对其进行验证,然后创建一个全新的报告,其中包含与 SQL 命令指定的名称和相应数据类型相同的可用字段,类似于 ORM 工具所做的事情。

由于这个工具的性质,我们使用反射和发射来创建一个全新的类。从 dataReader (System.Data.SqlClient.SqlDataReader) 提供的字段中,我们可以创建类型并使用相应的数据填充它。

这样做的结果是一个 IQueryable 对象,我可以在我的报告中使用它。

整个过程已经完成并经过测试,但是为了将报告、生成的类和 SQL 命令放在一起,我们需要将这种新类型保存在数据库中,因为或者我们的数据库布局和系统定义,这需要我提供将类似 XML 的文件或字符串转换为将在保存之前压缩并转换为 Base64 字符串的方法。

如果我要将报告保存到 DLL 文件中,这将是一项简单的任务,就像显示的 HERE

但由于这种新类型必须转换为类似 XML 的格式,所以我有点迷失在这里。

我过去做过相反的事情:手动从纯 XML 文件完全创建类型。我也知道我可以做类似的事情,但它需要我循环到类的每个细节/属性/方法/成员/等来创建 XML 文件。

有什么方法(比如 .NET 框架的助手)可以帮助我吗?
我不想 100% 手动完成,而是想委托 XML生成/解析到可能具有更好性能的工具...

编辑:

各位,发表评论前请阅读标题!我正在尝试为该类型保存一个 XML。 类型。不是对象。类型。

@Mark Gravell 谢谢你的提示。我会检查的。 但是关于架构:有什么方法可以自动保存/加载它?

【问题讨论】:

  • XmlSerializer 在这种情况下不起作用是否有原因?
  • XmlSerializer 不起作用吗?听起来应该……
  • 为什么还要保存创建的类型?为什么不能每次都重新创建?
  • @JohnSaunders 你真的不必这么说。我只是忘记了标题上不允许使用标签。有史以来第一次。不要痛苦。

标签: c# xml reflection reflection.emit


【解决方案1】:

为了保存 type,我会说 either 只是存储模式,然后在运行时重新创建 compatible 类型,或者只是使用 AssemblyBuilder 等并将动态程序集配置为可保存,并将其作为 .dll 写入磁盘(或其他地方)。然后只需在运行时加载 .dll 并找到类型。任何一种方法都可以工作。如果您已经有了从模式创建类型的代码,第一个可能更容易。

为了保存数据,我的第一直觉是XmlSerializer,但是它通过程序集生成工作,所以它可能不喜欢使用完全动态的类型,来自 TypeBuilder。如果 XmlSerializer 不满意,你可以试试 protobuf-net; 在内存中工作(默认情况下),所以应该很高兴。

但是!我应该注意,您可能还想考虑简单地使用 DataTable。虽然我对 DataTable 没有 大量 的喜爱,但它是为正是这种情况而设计的:

  • 它可以对仅在运行时定义的字段进行建模
  • 它内置了模式和数据的序列化
  • 它实现了用于声明运行时模型的 ComponentModel API
    • 这意味着大多数工具都可以免费使用它

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 2011-02-01
  • 2018-12-29
  • 2013-07-23
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多