Vb.Net 从字符串中获取报表名称

Vb.Net Get Report Name from String

我的项目中有不同的 Crystal 报告,例如:

RptHbl RptUBL 断路器 RptBAF

等等...

现在我有一个字符串,其中包含从数据库中获取的报告名称之一 喜欢:

Dim Myrptname = "RptHbl"

现在我要加载一个报表,我通常使用下面的代码来初始化报表

将 Myrpt 调暗为新的 RptHbl

现在如何使用存储在字符串 Myrptname 中的报告名称 像 Dim Myrpt as New "MyrptName"???????? 谢谢

首先,您需要报告的全名 class,因此如果数据库中的名称只是 class 名称,您需要附加命名空间:

Dim reportName As String = "RptHbl"
Dim fullTypeName As String = "MyNamespace." & reportName ' Consider using the NameOf operator

接下来,您可以使用Assembly.GetType,它使用反射来通过全名查找类型(即class)。但是,首先您需要获得对正确程序集的引用。如果你的报告在同一个程序集中,你可以这样做:

Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
Dim reportType As Type = reportAssembly.GetType(fullTypeName)

但是,如果报表在不同的程序集中,那么,只要您有对其中之一的引用,就可以这样做:

Dim reportAssembly As Assembly = GetType(RptHbl).Assembly
Dim reportType As Type = reportAssembly.GetType(fullTypeName)

一旦您拥有描述报告 class 的 Type 对象,您就可以使用 Activator.CreateInstance 方法创建它的实例,如下所示:

Dim report As Object = Activator.CreateInstance(reportType) 

我对 Crystal 报告知之甚少,但我假设所有报告 class 都来自某些基础 class。为了举例,我们假设它们都继承自一个名为 Report 的基 class。如果是这样,那么您可以将新实例转换为该基本类型,如下所示:

Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)

因此,为了将它们放在一起,您可以按照以下方式做一些事情:

Function CreateReport(name As String) As Report
    Dim reportTypeName As String = "MyNamespace." & name
    Dim reportAssembly As Assembly = Assembly.GetCallingAssembly()
    Dim reportType As Type = reportAssembly.GetType(reportTypeName)
    Return DirectCast(Activator.CreateInstance(reportType), Report)
End Function