Wie Sie richtig gegossen, eine Klasse zu einer abstrakten Klasse bei Verwendung von Typ-Generika?

Habe ich die folgenden Klassen

public abstract class BaseViewPresenter { }
public abstract class BaseView<T> : UserControl
    where T : BaseViewPresenter { }

public class LoginPresenter : BaseViewPresenter { }
public partial class LoginView : BaseView<LoginPresenter> {  }

Habe ich eine Methode, die so aussieht (vereinfacht)

public BaseView<BaseViewPresenter> Resolve(BaseViewPresenter model)
{
    var type = model.GetType();
    var viewType = _dataTemplates[type];

    //Correctly creates BaseView object
    var control = Activator.CreateInstance(viewType);

    //Fails to cast as BaseView<BaseViewPresenter> so returns null
    return control as BaseView<BaseViewPresenter>;
}

Wenn ich diese mit einem Instanzen von LoginPresenter

var login = new LoginPresenter();
var ctl = Resolve(login);

Die Linie Activator.CreateInstance(viewType) korrekt aufgelöst wird in eine neue Instanzen meiner LoginView jedoch control as BaseView<BaseViewPresenter> nicht tun können, die cast richtig, so gibt null.

Ist es ein Weg, um richtig wandeln Sie die control in BaseView<BaseViewPresenter> ohne Verwendung bestimmte Art Generika?

Seit LoginView erbt von BaseView<LoginPresenter>, und LoginPresenter erbt von BaseViewPresenter, ich würde annehmen, es gibt einen Weg, um zu konvertieren LoginView zu BaseView<BaseViewPresenter>.

Ich bin stecken mit .Net 3.5

Konnte verwenden Sie im interface statt einer abstrakten Klasse und mark T als kovariante? Ansonsten ist diese Art von Besetzung ist nicht erlaubt.
Nein, ich kann nicht, ich bin stecken mit .Net 3.5
Sie können nicht richtig gegossen, die Kontrolle in BaseView<BaseViewPresenter> weil es ein BaseView<LoginPresenter>
Sie könnten in der Lage sein, um Weg mit ihm: stackoverflow.com/questions/9210483/covariance-also-in-3-5-2-0 Ist mit einem 4.0-compiler erlaubt?
Aber LoginPresenter ist ein BaseViewPresenter, so würde ich davon ausgehen, es ist ein Weg, dies zu erreichen-Konvertierung. Bin ich falsch in diesem?

InformationsquelleAutor Rachel | 2014-09-11

Schreibe einen Kommentar