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
我的项目中有不同的 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