将类型T的generics属性转换为已知的inheritance类型

我收到以下编译器错误

无法将类型’T’转换为’ProjectReportingHandler’

为线

var projectReport = (ProjectReportingHandler)result.Report; 

在尝试编译时:

 public abstract class ReportingHandler { // Report stuff } public abstract class ProjectReportingHandler: ReportingHandler { // Report stuff // Project specific report stuff } public class ReportInstance where T : ReportingHandler { public T Report { get; private set; } } public class ReportLibraryEntry where T : ReportingHandler { public ReportInstance Create() { ReportInstance result = new ReportInstance(); if (result.Report is ProjectReportingHandler) { var projectReport = (ProjectReportingHandler)result.Report; // do stuff with project reports } return result; } } 

任何想法如何将链接generics类型属性result.Report转换为ProjectReportingHandler

我原以为where T : ReportingHandler会确保这是可能的:(

编辑:我似乎得到一些回复,说我接受的答案是不正确的。 它工作,我实现如下:

 public ReportInstance Create() { ReportInstance result = new ReportInstance(); ReportingHandler report = result.Report; if (report is ProjectReportingHandler) { var projectReport = (ProjectReportingHandler)report; // do stuff with project reports } return result; } 

为什么下来选票有效? 🙁

您可以通过首先将结果转换为对象,然后转移到ProjectReportingHandler来“欺骗”。

where T : ReportingHandler是不够的。
如果T是inheritanceReportingHandler而不是ProjectReportingHandler其他类型会发生什么?

如果您确定T将始终从ProjectReportingHandlerinheritance,则可以将约束更改为where T : ProjectReportingHandler

如果你真的想按照你现在的方式去做,你应该首先转换为ReportingHandler ,如下所示:

 var projectReport = ((ReportingHandler)result.Report) as ProjectReportingHandler; 

如果T不inheritanceProjectReportingHandler ,则projectReport将为null

T:ReporingHandler不保证转换是可能的。 仅仅因为ProjectReportingHandler是一个ReportingHandler并不意味着相反的情况。

使用如何:

  ReportInstance result = new ReportInstance(); var projectReport = result.Report as ProjectReportingHandler; if (projectReport != null) { //do stuff }