2017-05-12 10 views
-1

私はジェネリック型の条件で、このジェネリッククラスを持っている:C#クラスの制約

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

あなたの次のクラスのReportModel ReportHandlerタイプのパーツを作る考えてみましょうあなたは、代替案を見つけることができます。

は、私はあなたが、ReportHandlerReportControllerに別のジェネリック型パラメータを追加IReportHandlerを実装する新しいタイプのパラメータを制約し、ReportModelTypeReportModel<ReportHandler>を実装させることを示唆しています。

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

ジェネリック型のワイルドカードのようなものは、あなたがしかし

はそれインタフェース

public interface IReportModel 
{} 

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

そのインタフェースを使用してください検討するかもしれない2つのソリューションがありますC#の

ではありません:

... ReportController<ReportModelType> : Controller 
    where ReportModelType : IReportModel 
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#での一般的なワイルドカードはとてもすべて、ありません:はあなたが行うことができます

... ReportController<ReportModelType> : Controller 
    where ReportModelType : ReportModel<ReportHandler> 
    where ReportHandler : IReportHandler 
関連する問題