繁体   English   中英

如何在 C# 中编写带有变量类的函数

[英]How do I write a function with variable classes in C#

我的应用程序的多个位置都有以下代码:

var subReport = new XRptEventHeader();
var eventHeaderList = FreqReports.GetEventHeaderList(studyPK);
var dataSourceSubReport = (XRSubreport)oRpt.FindControl("xrSubreportSite", false);
dataSourceSubReport.ReportSource = subReport;
dataSourceSubReport.ReportSource.DataSource = eventHeaderList;

它用于oRpt类型不同的多个地方。 我试图使用像这样的通用东西

public static T SetEventHeader<T>(T oRpt , Guid studyPK)
{
    var subReport = new XRptEventHeader();
    var eventHeaderList = FreqReports.GetEventHeaderList(studyPK);
    var dataSourceSubReport = (XtraReport)oRpt.FindControl("xrSubreportSite", false);
    dataSourceSubReport.ReportSource = subReport;
    dataSourceSubReport.ReportSource.DataSource = eventHeaderList;
    return oRpt;
}

但是当我到达终点时

var dataSourceSubReport = (XtraReport)oRpt.FindControl("xrSubreportSite", false);

并且oRpt即使我使用每个类的基类进行oRpt它也没有FindControl函数。

有没有人对我如何让它发挥作用有任何建议?

您需要做的是将T的值限制为所有oRpt共享的基类或接口。 您可以通过添加“通用约束”来做到这一点。

在您的情况下,我怀疑您正在编写一个网站,因此所有oRpt的基类都可以是System.Web.UI.Control 如果不是,则为您的特定需求制定适当的基类型(类或接口)。

public static T SetEventHeader<T>(T oRpt , Guid studyPK)
     // Add a "generic constraint" to ensure T is a Control.
     where T : System.Web.UI.Control
{
    var subReport = new XRptEventHeader();
    var eventHeaderList = FreqReports.GetEventHeaderList(studyPK);
    var dataSourceSubReport = (XtraReport)oRpt.FindControl("xrSubreportSite", false);
    dataSourceSubReport.ReportSource = subReport;
    dataSourceSubReport.ReportSource.DataSource = eventHeaderList;
    return oRpt;
}

感谢 RB,因为他们给了我所需的信息。 这也让我意识到我需要投射其他东西并尝试/捕获如果该部分由于某种原因不存在。 这是最终有效的代码:

public static T SetEventHeader<T>(T oRpt, Guid studyPK)
        where T : XtraReport
    {
          
        try
        {
            XRSubreport dataSourceSubReport = oRpt.FindControl("xrSubreportSite", false) as XRSubreport;
            var subReport = new XRptEventHeader();
            var eventHeaderList = FreqReports.GetEventHeaderList(studyPK);
            dataSourceSubReport.ReportSource = subReport;
            dataSourceSubReport.ReportSource.DataSource = eventHeaderList;
            return oRpt;
        }
        catch (Exception ex)
        {
            return oRpt; //subsection not present
        }
        
        
    }

暂无
暂无

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

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