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

时间:2010-01-08 16:46:29

标签: c# generics

我收到以下编译错误

  

无法将类型'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<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.Report强制转换为ProjectReportingHandler

我原以为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;
}

为什么下来投票给一个有效的答案? :(

4 个答案:

答案 0 :(得分:4)

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

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

如果你真的想按照你现在的方式去做,你应该先投射到ReportingHandler,如下所示:

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

如果T未继承ProjectReportingHandler,则projectReport将为null

答案 1 :(得分:3)

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

答案 2 :(得分:1)

如何使用as

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

答案 3 :(得分:0)

你可以通过首先将结果“作弊”。记录到一个对象,然后再到一个ProjectReportingHandler。

相关问题