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

时间:2018-08-01 19:32:26

标签: string vb.net class crystal-reports

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

RptHbl RptUBL RptMCB RptBAF

以此类推...

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

Dim Myrptname =“ RptHbl”

现在,我想加载一个报告,为此,我通常使用以下代码来初始化报告

将Myrpt设为新的RptHbl

现在如何使用存储在字符串Myrptname中的报告名称 喜欢 Dim Myrpt作为新的“ MyrptName” ??????? 谢谢

1 个答案:

答案 0 :(得分:1)

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

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

接下来,您可以使用Assembly.GetType,它使用反射来通过全名查找类型(即类)。但是,首先,您需要获得正确组件的参考。如果您的报告在同一程序集中,则可以执行以下操作:

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)

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

Dim report As Object = Activator.CreateInstance(reportType) 

我对Crystal Reports的了解不足,但是我假设所有报表类都派生自某些基类。为了举例说明,我们假设它们都继承自名为Report的基类。如果是这样,则可以将新实例转换为该基本类型,如下所示:

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
相关问题