gpt4 book ai didi

c# - 将类型 T 的泛型属性转换为已知的继承类型

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:38 24 4
gpt4 key购买 nike

我收到以下编译器错误

Cannot convert type 'T' to '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<T>
where T : ReportingHandler
{
public T Report { get; private set; }
}

public class ReportLibraryEntry<T>
where T : ReportingHandler
{
public ReportInstance<T> Create()
{
ReportInstance<T> result = new ReportInstance<T>();

if (result.Report is ProjectReportingHandler)
{
var projectReport = (ProjectReportingHandler)result.Report;
// do stuff with project reports
}

return result;
}
}

任何想法如何转换链接的泛型类型属性 result.ReportProjectReportingHandler ?

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

编辑:我似乎收到一些回复说我接受的答案不正确。它有效,我按如下方式实现它:
public ReportInstance<T> Create()
{
ReportInstance<T> result = new ReportInstance<T>();

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

return result;
}

为什么对一个有效的答案投反对票? :(

最佳答案

where T : ReportingHandler是不足够的。
如果 T 会发生什么?是继承 ReportingHandler 的其他类型但不是 ProjectReportingHandler ?

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

如果您真的想按照现在的方式进行操作,则应首先转换为 ReportingHandler , 像这样:

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

如果 T不继承 ProjectReportingHandler , projectReport将是 null .

关于c# - 将类型 T 的泛型属性转换为已知的继承类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com