在我们的应用程序(C# - .NET 4.5)中,我们有一个报告生成工具。该工具必须仅接收 SQL 命令,对其进行验证,然后创建一个全新的报告,其中包含与 SQL 命令指定的名称相同的可用字段和相应的数据类型,类似于 ORM 工具的操作。
由于该工具的性质,我们使用 Reflection 和 Emit 来创建一个全新的类。从 dataReader (System.Data.SqlClient.SqlDataReader
) 提供的字段中,我们可以创建类型并用相应的数据填充它。
其结果是一个 IQueryable 对象,我可以在我的报告中使用它。
整个过程已完成并经过测试,但为了将报告、生成的类和 SQL 命令保存在一起,我们需要将这个新类型保存在数据库上,因为我们的数据库布局和系统定义,这需要我提供将类似 XML 的文件或字符串传递给一个方法,该方法将在保存之前压缩并转换为 Base64 字符串。
如果我将报告保存到 DLL 文件中,这将是一个简单的任务,就像所示的 HERE 一样。 .
但是由于这种新类型必须转换为类似 XML 的格式,所以我有点迷失了。
我过去做了相反的事情:手动从纯 XML 文件完全创建类型。我也知道我可以做类似的事情,但这需要我循环进入类的每个细节/属性/方法/成员/等来创建 XML 文件。
有什么方法(比如 .NET 框架的助手)可以帮助我吗?
我不想将 XML 生成/解析委托(delegate)给一个可能具有更好性能的工具,而不是 100% 手动完成...
编辑:
各位,发表评论前请先阅读标题!我正在尝试保存该类型的 XML。 类型。不是对象。类型。
@马克·格拉维尔 谢谢你的提示。我会检查一下。 但是关于模式:有什么方法可以自动保存/加载它吗?
最佳答案
为了保存类型,我想说要么简单地存储架构,并在运行时重新创建兼容类型,或者只是使用 AssemblyBuilder 等并将动态程序集配置为可保存,并将其作为 .dll 写入磁盘(或其他地方)。然后只需在运行时加载 .dll 并找到类型即可。任何一种方法都可行。如果您已经有了从架构创建类型的代码,第一个可能会更容易。
为了保存数据,我的第一 react 是XmlSerializer
,但是它是通过程序集生成来工作的,所以它可能不喜欢反对来自 TypeBuilder 的完全动态类型。如果 XmlSerializer 不满意,您可以尝试 protobuf-net; 也在内存中工作(默认情况下),所以应该很高兴。
但是!我应该指出,您可能还想考虑简单地使用数据表。虽然我对 DataTable 没有太多的喜爱,但它是为完全这种场景而设计的:
- 它可以对仅在运行时定义的字段进行建模
- 它具有架构和数据的内置序列化
- 它实现了用于声明运行时模型的 ComponentModel API
- 这意味着大多数工具都可以免费使用它
关于c# - 保存和恢复运行时创建的类型(不是对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11125976/