繁体   English   中英

c# 使用反射的动态实例化

[英]c# dynamic instantiation using reflection

我正在导出一份报告,我注意到我为每个报告复制了很多代码。 我想把它放在一个单独的 class 的方法中,但是经过一些研究后我不确定如何进行实例化。 我的代码如下:

    ActiveReport rpt = new Reports.rptContractListing_Merchant();
    rpt.Run();
    try
    {
        rpt.Run(false);
    }
    catch (DataDynamics.ActiveReports.ReportException eRunReport)
    {
        // Failure running report, just report the error to the user:
        Response.Clear();
        Response.Write("<h1>Error running report:</h1>");
        Response.Write(eRunReport.ToString());
        return;
    }
    XlsExport xls = new XlsExport();
    xls.MinColumnWidth = (float)0.5;
    xls.Export(rpt.Document, m_stream);
    m_stream.Position = 0;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("content-disposition", "inline;    filename=ContractListing_Merchant.xls");
    System.IO.MemoryStream m_stream = new System.IO.MemoryStream();
    Response.BinaryWrite(m_stream.ToArray());
    Response.End();

这是我不确定反射的部分:

ActiveReport rpt = new Reports.rptContractListing_Merchant();

另一个例子:

    ActiveReport rpt = new Reports.rptContractDetails();
    try
    {
        rpt.Run(false);
    }
    catch (DataDynamics.ActiveReports.ReportException eRunReport)
    {
        // Failure running report, just report the error to the user:
        Response.Clear();
        Response.Write("<h1>Error running report:</h1>");
        Response.Write(eRunReport.ToString());
        return;
    }

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "inline; filename=ContractDetails.pdf");

    PdfExport pdf = new PdfExport();
    System.IO.MemoryStream memStream = new System.IO.MemoryStream();
    pdf.Export(rpt.Document, memStream);
    Response.BinaryWrite(memStream.ToArray());
    Response.End();

我认为Activator.CreateInstance<T>()是通往 go 的方式,其中 T 是您生成的报告类型

您有许多选择,其中许多甚至不需要反思。

如果您可以保证所有报表类都有一个“默认”构造函数(不带参数),则可以使用 generics 并指定泛型类型必须具有默认构造函数。 然后你可以说new T()

否则,您可以使用依赖注入来基于给定类型创建报告,或者您可以让您的方法将报告本身作为参数(必须由调用方法提供),并使用剩余的重复代码。

我刚刚将 rpt object 传递给一个方法,其中包含代码。 有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM