将类型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
将始终从ProjectReportingHandler
inheritance,则可以将约束更改为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 }