2

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

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

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

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

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

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

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

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

编辑:

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

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

4

1 回答 1

2

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

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

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

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