我的项目中有不同的Crystal Reports,例如:
RptHbl RptUBL RptMCB RptBAF
以此类推...
现在我有一个字符串,其中包含从数据库获取的报告名称之一 喜欢:
Dim Myrptname =“ RptHbl”
现在,我想加载一个报告,为此,我通常使用以下代码来初始化报告
将Myrpt设为新的RptHbl
现在如何使用存储在字符串Myrptname中的报告名称 喜欢 Dim Myrpt作为新的“ MyrptName” ??????? 谢谢
答案 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