2017-09-27 59 views
2

我有我的设计问题:泛型与继承设计 - 需要帮助解决

我有一些基类

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>

我在做什么错误以及如何纠正?

回答

4

我相信这是你正在尝试做的

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>这就是你要怎样做。
+2

是的,正是我想通了 - 这是正确的答案。谢谢 – pitersmx

+1

你能解释一下,OP的代码有什么问题,以及为什么你的解决方案真正解决了它? –

+0

我错过了一些泛型约束条件 – pitersmx