2017-05-12 137 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>