2017-05-12 109 views
-1

我有这样的通用类与通用类型的条件#类的限制:下与泛型类型参数

public abstract class ReportModel<ReportHandler> where ReportHandler : IReportHandler 

然后,我有这个控制器类

public abstract class ReportController<ReportModelType> : Controller 

我需要的是一个条件, ReportModelType必须继承类的摘要ReportModel类。麻烦的是,Im然后强制给出一个ReportModel的类型参数,我不想指定参数。我需要这样的通配符:

public abstract class ReportController<ReportModelType> : Controller where ReportModelType : ReportModel<*any type which satifies ReportModels contraint> 

任何人都可以提供解决方案吗?

+0

你是什么意思,你被迫提供一个类型参数?我不太明白那部分 – nocodename

+0

只要我写*其中ReportModelType:ReportModel *我会得到一个错误,说我必须为ReportModel提供一个类型参数 –

回答

1

你可以这样做:

public interface IReportHandler 
{ 

} 

public abstract class ReportModel<ReportHandler> 
    where ReportHandler : IReportHandler 
{ 
} 

public abstract class ReportController<ReportModelType, ReportHandler> 
    where ReportModelType : ReportModel<ReportHandler> 
    where ReportHandler : IReportHandler 
{ 

} 
1

有作为在C#泛型类型通配符没有这样的事情

有两种解决方案,但你可能会考虑

让它的界面

public interface IReportModel 
{} 

public abstract class ReportModel<ReportHandler> : IReportModel 
    where ReportHandler : IReportHandler 

使用该接口:

... ReportController<ReportModelType> : Controller 
    where ReportModelType : IReportModel 

考虑让隔壁班的ReportModel ReportHandler型部分

... ReportController<ReportModelType> : Controller 
    where ReportModelType : ReportModel<ReportHandler> 
    where ReportHandler : IReportHandler 
1

据我所知,还没有在C#泛型通配符,因此所有你可以做的是找到一个替代方案。

我建议你添加一个泛型类型参数ReportHandlerReportController,约束新类型的参数来实现IReportHandler,使ReportModelType实施ReportModel<ReportHandler>

public abstract class ReportController<ReportModelType, ReportHandler> : Controller 
    where ReportHandler : IReportHandler 
    where ReportModelType: ReportModel<ReportHandler>