C # приведение унаследованного универсального интерфейса

У меня возникли проблемы с созданием интерфейса, который я придумала. Это дизайн MVP для C # Windows Forms. У меня есть класс IView, который я реализую на своих классах формы. Также имеется IPresenter, который я выводю из различных конкретных докладчиков. Каждый Presenter будет управлять IView по-разному в зависимости от роли, например, открывая диалоговое окно для ввода нового набора данных с помощью AddPresenter, в отличие от редактирования существующих данных с помощью EditPresenter, который будет предварительно загружать данные в форму. Каждый из них наследуется от IPresenter. Я хочу использовать код как таковой:

AddPresenter<ConcreteView> pres = new AddPresenter<ConcreteView>();

У меня в основном это работает, но эти презентаторы и представления, которыми они управляют, объединены в плагины, которые загружаются после выполнения, что означает, что мне нужен класс Manager, который действует как интерфейс плагина, принимающий «режим». параметр. Этот параметр режима используется для фабричного метода, чтобы создать либо Добавить, либо Редактировать Презентатора, но поскольку вызов для показа диалогового окна выполняется позже, мне нужно выполнить вызов через интерфейс IPresenter, например так:

private IPresenter<IView> pres;
public ShowTheForm()
{
    pres.ShowDialog();
}

Теперь у меня возникают проблемы, когда дело доходит до того, чтобы описать мою конкретную реализацию, скажем, AddPresenter, скажем, для «pres». член. Вот урезанная упрощенная версия того, что у меня есть:

interface IView
{
    void ViewBlah();
}

interface IPresenter<V> where V : IView
{
    void PresBlah();
}

class CView : IView
{
    public void ViewBlah()
    {        
    }
}

class CPresenter<T> : IPresenter<T> where T : IView
{
    public void PresBlah()
    {
    }
}

private void button3_Click(object sender, EventArgs e)
{
    CPresenter<CView> cpres = new CPresenter<CView>();
    IPresenter<IView> ipres = (IPresenter<IView>)cpres;
}

Это ошибка:

Unable to cast object of type 'CPresenter`1[MvpApp1.MainForm+CView]' to type 'IPresenter`1[MvpApp1.MainForm+IView]'.

И Presenter, и общая спецификация типа из того, что я могу сказать, являются подклассами интерфейсов, так что я не могу понять, почему он не был приведен.

Какие-нибудь мысли?

Стив

Ответы на вопрос(2)

Ваш ответ на вопрос