如何创建泛型类结构

时间:2017-01-19 05:26:10

标签: c# design-patterns

我有一个要求,用户从下拉列表中选择一个ReportType并点击下载按钮。根据他选择的类型,系统应该生成一个报告。现在我只有QuoteReport的报告类型。将来我会有其他报告类型,如PolicyReport,ClaimReport。现在我也不知道这些报告中的数据字段是什么。

public class QuoteReport
{
  public String DeviceType { get; set; }
  public String ProductName { get; set; }
  public String Description { get; set; }
  public String ID { get; set; }
  public String Address { get; set; }     
}

现在我正在做的是发送报告类型和参数来填充报告,我创建了一个切换案例来捕获被选中的报告类型。

public string PrepareReport(string selectedReport, List<int> Ids)
{
    string response = string.Empty;
    try
    {
        ReportTypeEnum reportTypeEnum;
        if (Enum.TryParse(selectedReport, out reportTypeEnum))
        {
            switch (reportTypeEnum)
            {
                case ReportTypeEnum.QuoteReport:
                    response = CreateReportData(Ids,response);
                    break;
                default:
                    break;
            }
        }
    }
    catch (Exception exc)
    {
        handleException(DOWNLOAD_REPORT, exc);
    }
    return response;
}

我的方法CreateReportData从wcf填充QuoteReport类的字段。

 public string CreateReportData(List<int> Ids, string response)
 {
    List<QuoteReport> quoteReportList = new List<QuoteReport>();            
    foreach (var Id in Ids)
    {
        dynamic dynamicEntity;
        List<string> devices = proxy.GetData(Id);
        for (int i = 0; i < devices.Count; i++)
        {
            QuoteReport quoteReport = new QuoteReport();
            dynamicEntity = JObject.Parse(devices[i]);
            quoteReport.Type = dynamicEntity.DeviceTypeString;
            quoteReport.ProductName = dynamicEntity.ProductName;
            quoteReport.Description = dynamicEntity.Desc;
            quoteReport.ID = dynamicEntity.ID;
            assetReport.Address = dynamicEntity.Address;
             quoteReportList.Add(quoteReport );

        }
    }
    response = JsonConvert.SerializeObject(quoteReportList );
    return response;
}

现在我很困惑如何让我的代码更通用。或者我应该使用像Factory这样的设计模式来使代码适应未来的需求。如何使CreateReportData方法通用,以便它接受任何类类型并从服务中填充其属性。

1 个答案:

答案 0 :(得分:2)

我不会重写所有内容(你有som命名问题和conserns问题的分离),但总的来说,你可以拥有一个签名为IReport的接口Generate(List<int> Ids),然后是每种类型的report实现了这个(并且类/报告本身决定如何处理数据)

public class QuoteReport: IReport
{
  public String DeviceType { get; set; }
  public String ProductName { get; set; }
  public String Description { get; set; }
  public String ID { get; set; }
  public String Address { get; set; }  

  public void Generate(List<int> ids)
  {
        // create "itself"
  }   
}

根据您的一般情况,您可以决定在哪里绘制分色,然后将哪些内容传递给Generate()。它可以是设备列表,也可以是您的代理+ ID