C# ASP.NET BasePage反向引用到具体实现

C# ASP.NET BasePage反向引用到具体实现,c#,asp.net,generics,webforms,page-lifecycle,C#,Asp.net,Generics,Webforms,Page Lifecycle,我有一个页面是这样设置的 public partial class _Default : ViewBasePage<EmployeePresenter, IEmployeeView>, IEmployeeView { ... } 因为这实际上是ViewBasePage,所以它不能直接转换为TView 因此,我的实际问题是,有没有其他方法可以让我感觉不那么粗糙,如果这是主要的选择,那么以这种方式处理我的页面真的有什么需

我有一个页面是这样设置的

public partial class _Default : ViewBasePage<EmployeePresenter, IEmployeeView>,
                                 IEmployeeView
{
...
}
因为这实际上是
ViewBasePage
,所以它不能直接转换为TView

因此,我的实际问题是,有没有其他方法可以让我感觉不那么粗糙,如果这是主要的选择,那么以这种方式处理我的页面真的有什么需要我关注的吗

编辑:

我想写的确切部分是

private static TView GetView()
{
    return (TView) HttpContext.Current.Handler;
}
因为我觉得这是一个相当严重的黑客行为,能够在这种情况下引用该页面。

我不知道
(TView)这是如何工作的
指的是碰巧是
页面
的类。您无法将
页面
转换为
IView

您当前的实现看起来一点也不粗糙

我错过什么了吗

编辑:现在我对你的情况有了更好的了解;让ViewBasePage从IView继承(并将其从_默认页面中删除)怎么样

编辑此外,如果希望默认页面必须实现接口中定义的功能,可以让ViewBasePage类抽象地实现接口的功能

public class _Default : ViewBasePage<Presenter<IView>, IView>
{
    #region Overrides of classB
    public override void test()
    {
        //perform the test steps.
    }
    #endregion
}
public abstract class ViewBasePage<TPresenter, TView> :
    Page, IView
    where TPresenter : Presenter<TView>
    where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = (TView)((IView)this); //<- Now it does work
        }
    }
    #region Implementation of IView
    public abstract void test();
    #endregion
}
public interface IView
{
    void test();
}
public abstract class Presenter<TView> where TView : IView
{
    public TView View { get; set; }
    public virtual void OnViewInitialized(){}
    public virtual void OnViewLoaded(){}
}
public类\u默认值:ViewBasePage
{
#类B的区域覆盖
公共覆盖无效测试()
{
//执行测试步骤。
}
#端区
}
公共抽象类ViewBasePage:
页面,IView
其中TPresenter:演示者
TView:IView在哪里
{
受保护的TPresenter\u演示者;
公共TPresenter演示者
{
设置
{
_演示者=值;
_presenter.View=(TView)(IView)this);//我看不出
(TView)this
应该如何工作。
this
指的是碰巧是
页面
的类。不能将
页面
转换为
IView

您当前的实现看起来一点也不粗糙

我错过什么了吗

编辑:现在我对您的情况有了更好的了解;让ViewBasePage从IView继承(并将其从您的默认页面中删除)怎么样

编辑此外,如果希望默认页面必须实现接口中定义的功能,可以让ViewBasePage类抽象地实现接口的功能

public class _Default : ViewBasePage<Presenter<IView>, IView>
{
    #region Overrides of classB
    public override void test()
    {
        //perform the test steps.
    }
    #endregion
}
public abstract class ViewBasePage<TPresenter, TView> :
    Page, IView
    where TPresenter : Presenter<TView>
    where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = (TView)((IView)this); //<- Now it does work
        }
    }
    #region Implementation of IView
    public abstract void test();
    #endregion
}
public interface IView
{
    void test();
}
public abstract class Presenter<TView> where TView : IView
{
    public TView View { get; set; }
    public virtual void OnViewInitialized(){}
    public virtual void OnViewLoaded(){}
}
public类\u默认值:ViewBasePage
{
#类B的区域覆盖
公共覆盖无效测试()
{
//执行测试步骤。
}
#端区
}
公共抽象类ViewBasePage:
页面,IView
其中TPresenter:演示者
TView:IView在哪里
{
受保护的TPresenter\u演示者;
公共TPresenter演示者
{
设置
{
_演示者=值;

_presenter.View=(TView)((IView)this);//该页面实现了IView,因此可以在页面加载{IView View=(IView)this;}在页面级别可以正常工作,这是在基页,它指的是基页,而不是它实现IView的页面。黑客部分使用的是HttpContext。只有在您能够保证继承类也继承了IView的情况下,这才允许工作。对于gaurantee,继承类确实继承了IView将是ewBasePage也是从IView继承的。我正在尝试写HttpContext调用好吧,我忘记从我的示例中删除它,现在看看。你尝试过构建它吗?这仍然会得到一个铸造错误。C#似乎不理解TView inside ViewBasePage与TView inside Presenter相同,即使有where约束。页面在页面_Load{IView view=(IView)THIS;}中实现IView so say在页面级别可以正常工作,这是在基页,它指的是基页,而不是它实现IView的页面。黑客部分使用的是HttpContext。只有在您能够保证继承类也继承了IView的情况下,这才允许工作。对于gaurantee,继承类确实继承了IView将是ewBasePage也是从IView继承的。我正在尝试写HttpContext调用好吧,我忘了从我的示例中删除它,现在看一看。你试过构建它吗?仍然会出现一个铸造错误。C似乎不理解TView inside ViewBasePage与TView inside Presenter相同,即使有where约束。好的,我把它从我的例子中删除了。我把它作为一个工件放在里面,但是它没有被使用。好吧,我把它从我的例子中删除了。我把它作为一个工件放在里面,但是它没有被使用。
public class _Default : ViewBasePage<Presenter<IView>, IView>
{
    #region Overrides of classB
    public override void test()
    {
        //perform the test steps.
    }
    #endregion
}
public abstract class ViewBasePage<TPresenter, TView> :
    Page, IView
    where TPresenter : Presenter<TView>
    where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = (TView)((IView)this); //<- Now it does work
        }
    }
    #region Implementation of IView
    public abstract void test();
    #endregion
}
public interface IView
{
    void test();
}
public abstract class Presenter<TView> where TView : IView
{
    public TView View { get; set; }
    public virtual void OnViewInitialized(){}
    public virtual void OnViewLoaded(){}
}