C#Generic Constraint - 如何引用当前类类型?

Rez*_*ler 11 c# generics

我有以下类/接口:

public abstract class AbstractBasePresenter<T> : IPresenter<T> 
    where T : class, IView
{
}

public interface IPresenter<T>
{
}

public interface IView<TV, TE, TP> : IView
    where TV : IViewModel
    where TE : IEditModel
    //where TP : AbstractBasePresenter<???>
{
}

public interface IView {}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以限制TP在IView <>上的TP是一个继承自AbstractBasePresenter的类吗?

或者是我唯一的选择,创建一个非通用的IPresenter接口,然后更新IPresenter来实现它,然后使用检查"TP:IPresenter"?

谢谢

更新:

以下建议的答案不起作用:

public interface IView<TV, TE, TP> : IView
where TV : IViewModel
where TE : IEditModel
where TP : AbstractBasePresenter<IView<TV,TE,TP>>
{
}
Run Code Online (Sandbox Code Playgroud)

我将接口声明为:

public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter>
{ }

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView>
{ }
Run Code Online (Sandbox Code Playgroud)

编译器抱怨IInsuredDetailsPresenter不能分配给AbstractBasePresenter>

pba*_*aga 2

您可以做到这一点,但您需要向IView<>接口提供另一种类型参数:

public interface IView<TV, TE, TP, T> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : AbstractBasePresenter<T>
    where T : class, IView
{
}
Run Code Online (Sandbox Code Playgroud)

编辑:

根据您问题中的版本:IInsuredDetailsPresenter绝对不能分配给AbstractBasePresenter. 由于您在原始问题中请求的限制,编译器正在抱怨。更具体地说,由于这一部分

where TP : AbstractBasePresenter<T>
Run Code Online (Sandbox Code Playgroud)

看来你TP也想限制为一个接口。您可以尝试下面的代码:

public interface IView<TV, TE, TP, T> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : IPresenter<T>
{
}
Run Code Online (Sandbox Code Playgroud)

T不再需要对 的约束,因为IPresenter<T>没有。当然,您可以以类似的方式调整armen.shimoon的答案。重点是用约束代替AbstractBasePresenter<T>约束IPresenter<T>