我的设计有问题:

我有一些基础课

public class ReportConfig<T> where T: class
{
    public string ReportSavePath { get; set; }
    public string ReportTitle { get; set; }
    public T ReportData { get; set; }
}


并且可以将该类扩展为(提供的可能的子类之一):

public class CsvReportConfig<T> : ReportConfig<T> where T : class
{
     // some extra class specific props
}


然后,我有一个ReportGenerator抽象类

public abstract class ReportGenerator<T> where T : ReportConfig<T>
{
    public ReportGenerator(ReportConfig<T> config)
    {
        Config = config;
    }

    public ReportConfig<T> Config { get; set; }
    public abstract ReportGenerationResult GenerateReport();
}


然后,我想将ReportGenerator类扩展为:

public class Csv1ReportGenerator : ReportGenerator<CsvReportConfig<DataObj>>
{
    public Csv1ReportGenerator (CsvReportConfig<DataObj> config) : base(config)
    {

    }

    public override ReportGenerationResult GenerateReport()
    {
        throw new NotImplementedException();
    }
}


在这里,我收到一个错误


  CsvReportConfig<DataObj>不能用作类型参数'T'
  通用类型或方法ReportGenerator<T>


我在做什么错,以及如何解决这个问题?

最佳答案

我相信这就是你想要做的

public class ReportGenerationResult { }
public class DataObj { }
public class ReportConfig<T> where T : class
{
    public string ReportSavePath { get; set; }
    public string ReportTitle { get; set; }
    public T ReportData { get; set; }
}

public class CsvReportConfig<T> : ReportConfig<T> where T : class
{}

public abstract class ReportGenerator<T,U> where T : ReportConfig<U> where U : class
{
    protected ReportGenerator(T config)
    {
        Config = config;
    }

    public T Config { get; set; }
    public abstract ReportGenerationResult GenerateReport();
}
public class Csv1ReportGenerator : ReportGenerator<CsvReportConfig<DataObj>, DataObj>
{
    public Csv1ReportGenerator(CsvReportConfig<DataObj> config) : base(config)
    {
    }

    public override ReportGenerationResult GenerateReport()
    {
        throw new NotImplementedException();
    }
}




编辑

这些是所做的主要更改。


ReportGenerator-这是主要更改。在任何实现中,您似乎都想为属性Config指定通用类型参数(限制为扩展为ReportConfig<T>的类型)。为此,并保持ReportConfig.ReportData泛型,您必须使用2个泛型类型参数,其中第二个类型参数被重用来约束ReportConfig<T>
Csv1ReportGenerator-现在,当它继承ReportGenerator<CsvReportConfig<DataObj>, DataObj>而不是ReportGenerator<CsvReportConfig<DataObj>>时,现在使该类型具有属性Config,该属性将被限制为您要尝试的类型CsvReportConfig<DataObj>

关于c# - 具有继承设计的泛型-需要帮助修复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46446397/

10-14 07:41