保存并恢复在运行时创建的类型(非对象)?

时间:2012-06-20 18:35:39

标签: c# xml reflection reflection.emit

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

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

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

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

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

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

我在过去做了相反的事情:手动完全从纯XML文件创建一个类型。我也知道我可以做类似的事情,但它需要循环到类的每个detail / property / method / member / etc来创建XML文件。

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

编辑:

人们,在发表评论之前阅读标题!我正在尝试为该类型保存XML。的类型即可。不是对象。类型。

@Mark Gravell 谢谢你的提示。我会检查一下。 但关于架构:任何自动保存/加载的方式?

1 个答案:

答案 0 :(得分:2)

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

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

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

  • 它可以模拟仅在运行时定义的字段
  • 它具有模式和数据的内置序列化
  • 它实现了用于声明运行时模型的ComponentModel API
    • 表示大多数工具免费使用