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

时间:2012-09-07 07:54:05

标签: 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 {}

有什么办法可以在IView上限制TP&lt;&gt;是一个继承自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>>
{
}

我将接口声明为:

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

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView>
{ }

编译器抱怨IInsuredDetailsPresenter不能分配给AbstractBasePresenter&gt;

2 个答案:

答案 0 :(得分:4)

没问题,不需要另一个通用参数:

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

编辑:更新了问题:

如果您不需要演示者从AbstractBasePresenter继承,请将代码更改为:

public interface IView<TV, TE, TP> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : IPresenter<IView<TV,TE,TP>>
{
}

答案 1 :(得分:2)

你可以这样做,但是你需要为IView<>接口提供一个更多的类型参数:

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

修改

根据您问题中的版本:IInsuredDetailsPresenter绝对无法转让给AbstractBasePresenter。由于您在原始问题中要求的约束,编译器正在抱怨。更具体地说,由于这部分

where TP : AbstractBasePresenter<T>

似乎你想要将TP限制为一个接口。您可以尝试以下代码:

public interface IView<TV, TE, TP, T> : IView
    where TV : IViewModel
    where TE : IEditModel
    where TP : IPresenter<T>
{
}

不再需要T上的约束,因为IPresenter<T>没有。当然,你可以用类似的方式调整armen.shimoon的答案。关键是用AbstractBasePresenter<T>约束替换IPresenter<T>约束。