С# 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 >
Ответы
Ответ 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>>
{
}