试图找出这些接口

时间:2016-01-07 15:39:58

标签: c# generics

我试图创建一些接口。 IReportSection对象将包含一个字符串和一组项目,这些项目可能会有所不同,具体取决于我们正在使用的内容。我需要将它变成通用的吗?

IReport将有一个字符串和一个IReportSection的集合。

以下是我现在尝试定义的方式。

public interface IReport
{
    string ReportName { get; set; }

    ICollection<IReportSection> ReportSections { get; }
}

public interface IReportSection
{
    string ReportSectionName { get; set; }

    ICollection ReportItems { get; }
}

public abstract class ReportSectionBase : IReportSection
{
    public string ReportSectionName { get; set; }

    public ICollection ReportItems { get; set; }
} 

我的模特:

pulic class ProjectSubmissionViewModel
{
    public int ProjectSubmissionId { get; set; }
    public string SubmissionTitle { get; set; }
}

pulic class AffiliateViewModel
{
    public int AffiliateId { get; set; }
    public string AffiliateName { get; set; }
}

这就是我尝试在代码中使用它的方式:

public class ChapterAffiliates : ReportSectionBase
{
    public string ReportSectionName { get { return "Chapter Affiliates"; } }

    public ICollection<AffiliateViewModel> ReportItems { get; set; }
}

public class ChapterTitles : ReportSectionBase
{
    public string ReportSectionName { get { return "Chapter Titles"; } }

    public ICollection<ProjectSubmissionViewModel> ReportItems { get; set; }
}

public class SubmissionListViewModel : IReport
{
    public ICollection<ProjectSubmissionViewModel> Submissions { get; set; }

    public ICollection<AffiliateViewModel> Affiliates{ get; set; }

    public string ReportName { get; set; }

    public ICollection<IReportSection> ReportSections
    {
        get
        {
            var affiliateSection = new ChapterAffiliates
            {
                ReportItems = Affiliates
            };

            var titleSection = new ChapterTitles 
            {
                ReportItems = Submissions.Where(s => s.SubmissionTitle.Contains("SomePhrase")).ToList()
            };

            var sections = new List<IReportSection> { {subSection}, {titleSection} };

            return sections; 
        }
    }
}

我不确定如何最好地定义它。我很确定我之前已经做过,但它没有找到我。

1 个答案:

答案 0 :(得分:1)

某个报告中TRType的类型参数是否完全相同?例如。你会在其中包含不同报告类型的报告部分吗?

如果报告中的所有类型都相同,则解决方案相对简单:

public interface IReport<T> { ... }

如果不是这种情况 - 你必须做一些不同的事情,例如:

public interface IReportSection
{
    string ReportSectionName { get; }

    ICollection ReportItems { get; }
}

public abstract class ReportSectionBase<TRType> : IReportSection {
   ...
} 

这允许您在与报告相关的ReportSections集合中放置不同的基础类型。您还需要做更多的工作才能从每个报告部分获取所需的确切信息。