Я принял ответ Эрика, так как он дает отличное объяснение, почему то, что я хотел, было невозможно, но я также подумал, что поделюсь своим решением, если кто-то еще столкнется с этой проблемой.
Я удалил параметр generic type из моего исходного класса BaseView
и создал вторую версию класса BaseView
, которая включала в себя параметр типового типа и особенности для него.
Первая версия используется моим методом .Resolve()
или другим кодом, который не заботится о конкретных типах, а вторая версия используется любым кодом, который действительно заботится, например, имплантация BaseView
Вот пример того, как мой код закончил поиск
// base classes
public abstract class BaseViewPresenter { }
public abstract class BaseView : UserControl
{
public BaseViewPresenter Presenter { get; set; }
}
public abstract class BaseView<T> : BaseView
where T : BaseViewPresenter
{
public new T Presenter
{
get { return base.Presenter as T; }
set { base.Presenter = value; }
}
}
// specific classes
public class LoginPresenter : BaseViewPresenter { }
public partial class LoginView : BaseView<LoginPresenter>
{
// Can now call things like Presenter.LoginPresenterMethod()
}
// updated .Resolve method used for obtaining UI object
public BaseView Resolve(BaseViewPresenter presenter)
{
var type = model.GetType();
var viewType = _dataTemplates[type];
BaseView view = Activator.CreateInstance(viewType) as BaseView;
view.Presenter = presenter;
return view;
}