C # Casting einer geerbten generischen Schnittstelle

Ich habe einige Probleme damit, ein Interface zu erstellen, das ich mir ausgedacht habe. Es ist ein MVP-Entwurf für C # Windows Forms. Ich habe eine IView-Klasse, die ich in meinen Formularklassen implementiere. Es gibt auch einen IPresenter, den ich in verschiedene spezifische Presenter einarbeite. Jeder Presenter verwaltet die IView je nach Rolle unterschiedlich, z. B. indem er das Dialogfeld öffnet, um einen neuen Datensatz mit einem AddPresenter einzugeben, anstatt vorhandene Daten mit einem EditPresenter zu bearbeiten, der Daten vorab in das Formular lädt. Jedes dieser Elemente erbt von IPresenter. Ich möchte den Code als solchen verwenden:

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

Grundsätzlich funktioniert dies, aber diese Presenter und die von ihnen verwalteten Ansichten sind in Plugins zusammengefasst, die nach der Laufzeit geladen werden. Dies bedeutet, dass ich eine Manager-Klasse benötige, die als Plugin-Schnittstelle fungiert und einen "mode" -Parameter verwendet. Dieser Modus-Parameter wird für eine Factory-Methode verwendet, um entweder den Add Presenter oder den Edit Presenter zu erstellen. Da der Aufruf zum Anzeigen des Dialogfelds jedoch später erfolgt, muss der Aufruf über die IPresenter-Oberfläche wie folgt erfolgen:

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

Jetzt habe ich Probleme, wenn es darum geht, meine konkrete Instanziierung eines AddPresenter-Befehls an das 'pres'-Mitglied zu formulieren. Hier ist eine vereinfachte Version von dem, was ich habe:

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

Das ist der Fehler:

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

Sowohl die Presenter- als auch die Generic-Typspezifikation stammen aus den ARE-Unterklassen der Schnittstellen, sodass ich nicht verstehen kann, warum sie nicht umgewandelt werden.

Irgendwelche Gedanken?

Steve

Antworten auf die Frage(2)

Ihre Antwort auf die Frage