String Vb.Net从字符串获取报告名称
我的项目中有不同的Crystal报告,如: RptHbl RptUBL RptMCB RptBAF 等等 现在我有一个字符串,其中一个是从数据库中获取的报告名 比如: Dim Myrptname=“RptHbl” 现在我想加载一个报告,我通常使用下面的代码初始化该报告 Dim Myrpt作为新的RptHbl 现在,我如何使用存储在字符串Myrptname中的报表名称 喜欢 将Myrpt变暗为新的“MyrptName”???????String Vb.Net从字符串获取报告名称,string,vb.net,class,crystal-reports,String,Vb.net,Class,Crystal Reports,我的项目中有不同的Crystal报告,如: RptHbl RptUBL RptMCB RptBAF 等等 现在我有一个字符串,其中一个是从数据库中获取的报告名 比如: Dim Myrptname=“RptHbl” 现在我想加载一个报告,我通常使用下面的代码初始化该报告 Dim Myrpt作为新的RptHbl 现在,我如何使用存储在字符串Myrptname中的报表名称 喜欢 将Myrpt变暗为新的“MyrptName”??????? 谢谢首先,您需要报表类的全名,因此如果数据库中的名称只是类名,则
谢谢首先,您需要报表类的全名,因此如果数据库中的名称只是类名,则需要附加名称空间:
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)
Dim report As Object = Activator.CreateInstance(reportType)
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
但是,如果报告位于不同的程序集中,则只要有对其中一个报告的引用,就可以这样做:
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)
Dim report As Object = Activator.CreateInstance(reportType)
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
拥有描述报表类的Type
对象后,可以使用Activator.CreateInstance
方法创建其实例,如下所示:
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)
Dim report As Object = Activator.CreateInstance(reportType)
Dim report As Report = DirectCast(Activator.CreateInstance(reportType), Report)
我对Crystal报表的了解还不够,但我假设所有报表类都是从某个基类派生的。为了举例,我们假设它们都继承自一个名为Report
的基类。如果是,则可以将新实例强制转换为该基本类型,如下所示:
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)
Dim report As Object = Activator.CreateInstance(reportType)
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