Подтвердить что ты не робот

С# Generic Constraint - Как ссылаться на текущий тип класса?

У меня есть следующие классы/интерфейсы:

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 {}

Можно ли каким-либо образом ограничить TP на IView < > как класс, который наследуется от AbstractBasePresenter?

Или моя единственная альтернатива для создания не общего интерфейса IPresenter, а затем обновление IPresenter для его реализации, а затем использование проверки "TP: IPresenter"?

Спасибо

Update:

Предлагаемый ниже ответ не работает:

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 >

4b9b3361

Ответ 1

Вы можете это сделать, но вам нужно предоставить еще один аргумент типа интерфейсу IView<>:

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

Edit:

Согласно выпускам в вашем вопросе: 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>.

Ответ 2

Нет проблем, нет необходимости в другом общем параметре:

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>>
{
}