将T类型的泛型属性转换为已知的继承类型 [英] Cast generic property of type T up to a known inheriting type

查看:94
本文介绍了将T类型的泛型属性转换为已知的继承类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

出现以下编译器错误


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


为行

  var projectReport = (ProjectReportingHandler)result.Report; 

试图编译时:

{
// Report stuff
}

public abstract class ProjectReportingHandler:ReportingHandler
{
//报告内容
//项目特定报告内容
}

公共类ReportInstance< T>
其中T:ReportingHandler
{
public T Report {get;私人设置; }
}

公共类ReportLibraryEntry< T>
其中T:ReportingHandler
{
public ReportInstance< T> Create()
{
ReportInstance< T> result = new ReportInstance< T>();

if(result.Report是ProjectReportingHandler)
{
var projectReport =(ProjectReportingHandler)result.Report;
//执行项目报告
}

返回结果;




$ b $ p
$ b

任何想法如何转换链接泛型类型属性 result.Report 添加到 ProjectReportingHandler



认为其中T:ReportingHandler 可以确保这是可能的:($ / b
$ b

编辑:我似乎得到了一个

  public ReportInstance< T>创建()报告实例< T>结果=新的ReportInstance< T>(); 

ReportingHandler report = result.Report;
if(report是ProjectReportingHandler)
{
var projectReport =(ProjectReportingHandler)报告;
//完成项目报告
}

返回结果;
}

为什么选择了一个可以解决问题的答案?(


解决方案

您可以通过首先投射结果来作弊。报告给一个对象,然后传给一个ProjectReportingHandler。


I'm getting the following compiler error

Cannot convert type 'T' to 'ProjectReportingHandler'

for the line

var projectReport = (ProjectReportingHandler)result.Report;

when trying to compile:

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;
    }
}

Any ideas how to cast the linked generic type property result.Report to a ProjectReportingHandler?

I would have thought the where T : ReportingHandler would have ensured this was possible :(

EDIT: I seem to be getting a few responses that say my accepted answer is incorrect. It works, and I implemented it as follows:

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;
}

Why the down votes for an answer that worked? :(

解决方案

You can "cheat" by first casting result.Report to an object, and then to a ProjectReportingHandler.

这篇关于将T类型的泛型属性转换为已知的继承类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆