c # динамическая реализация с использованием отражения - PullRequest
2 голосов
/ 24 мая 2011

Я экспортирую отчет и заметил, что копирую много кода для каждого отчета.Я хотел бы поместить его в метод отдельного класса, но я не уверен в том, как выполнить часть создания экземпляра после некоторого исследования.Мой код ниже:

    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();

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Я думаю, Activator.CreateInstance<T>() - это путь, где T - тип создаваемого вами отчета.

1 голос
/ 24 мая 2011

У вас есть несколько опций, многие из которых даже не требуют отражения.

Если вы можете гарантировать, что все ваши классы отчетов имеют конструктор по умолчанию (без параметров), вы можете использоватьgenerics и укажите, что универсальный тип должен иметь конструктор по умолчанию.Тогда вы можете просто сказать new T().

В противном случае вы можете либо использовать внедрение зависимостей для создания отчета на основе заданного типа, либо вы можете сделать так, чтобы ваш метод принял сам Отчет в качестве аргумента (который должен бытьпредоставляется вызывающим методом) и занимает себя повторяющимся кодом.

0 голосов
/ 26 мая 2011

Я только что передал объект rpt в метод с кодом в нем. Это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...