C # lançando uma interface genérica herdada

Eu estou tendo algum problema em obter minha cabeça em torno de lançar uma interface que eu inventei. É um design de MVP para o C # Windows Forms. Eu tenho uma classe IView que eu implemento nas minhas classes de formulário. Há também um IPresenter que eu uso em vários apresentadores específicos. Cada apresentador gerenciará o IView de maneira diferente, dependendo da função, por exemplo, abrindo a caixa de diálogo para inserir um novo conjunto de dados com um AddPresenter, em vez de editar os dados existentes em um EditPresenter que pré-carregará dados no formulário. Cada um deles herda do IPresenter. Eu quero usar o código como tal:

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

Eu basicamente tenho esse trabalho, mas esses apresentadores e os modos de exibição que eles gerenciam são empacotados em plugins que são carregados após o tempo de execução, o que significa que eu preciso de uma classe Manager que atua como a interface do plugin usando um parâmetro "mode". Este parâmetro de modo é usado para um método de fábrica para criar o Add ou Edit Presenter, mas como a chamada para mostrar o diálogo é feita mais tarde, então eu preciso fazer a chamada através da interface do IPresenter da seguinte forma:

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

Agora estou tendo problemas quando se trata de encapsular minha instanciação concreta de um AddPresenter, para o membro 'pres'. Aqui está uma versão simplificada do que eu tenho:

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

Este é o erro:

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

Tanto o Presenter quanto a especificação do tipo Generic, do que eu posso dizer, são subclasses das interfaces, então não consigo entender por que ele não será lançado.

Alguma ideia?

Steve

questionAnswers(2)

yourAnswerToTheQuestion