c# - 保存和恢复运行时创建的类型(不是对象)?

标签 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 文件完全创建类型。我也知道我可以做类似的事情,但这需要我循环进入类的每个细节/属性/方法/成员/等来创建 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/

相关文章:

java - 将泛型对象转换为泛型类

java - 通过反射区分方法是否有任意数量的参数

c# - 将 MailItem 转换为内存中的 MSG,而不是文件系统中的 MSG

c# - 比较列表中的日期时间元素 C#

c# - 如何检查 XmlDocument C# 中的 XmlDeclaration

Android string.xml 和 xmlstarlet

java - JAXB 如何将 XML 字符串附加到 XML 元素中?

c# - Type.GetType(string) 使用 "Generic<T>"语法?

c# - 为方法编写 NUnit 测试用例

c# - 如何在另一个位置创建数据库而不是默认哺乳 c :\Users\USER in ASP. NET Core 2.2