我的设计有问题:
我有一些基类
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>
。
我做错了什么以及如何纠正这个问题?
答案 0 :(得分: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>
类型是你想要做的。