如何在客户端类中使用非通用接口的通用方法?

时间:2019-04-23 10:27:39

标签: c# oop

我有一个具有通用返回类型方法的非通用接口。

public interface IReport
{
    List<T> GenerateReport<T>();
}

如何在客户端类中实现此方法?我尝试了以下方法。全部显示错误。 方法1:

public class Report : IReport
{
    public List<T> GenerateReport<T>()
    {
        return new List<ReportModel>(){ new ReportModel { Name="Report1" } };
    }
}

方法2:

public class Report : IReport
{
    public List<ReportModel> GenerateReport<ReportModel>()
    {
        return new List<ReportModel>(){ new ReportModel { Name="Report1" } };
    }
}

1 个答案:

答案 0 :(得分:2)

你不能,不是那样。

您的IReport接口保证您有一种方法GenerateReport,该方法可以接受任何类型的报告,并将生成该报告。

您的Report类仅承诺能够生成ReportModels-它不能生成任何类型的报告。

如果我有一个类型为IReport的变量,我希望能够要求它生成任何类型的报告,例如:

IReport report = ...
report.GenerateReport<ReportModel>();
report.GenerateReport<OtherReportModel>();

您的Report类无法做到这一点-它只能生成包含ReportModel的报告,因此您在界面中违反了合同。

您可能想做的是使整个IReport接口通用:

public interface IReport<T>
{
    List<T> GenerateReport();
}

然后您的Report类可以实现IReport<ReportModel>。这意味着它承诺将生成包含ReportModel且不包含其他类型报告的报告:

public class Report : IReport<ReportModel>
{
    public List<ReportModel> GenerateReport()
    {
        return new List<ReportModel>(){ new ReportModel { Name="Report1" } };
    }
}