1

このように設定されたページがあります

public partial class _Default : ViewBasePage<EmployeePresenter, IEmployeeView>,
                                 IEmployeeView
{
...
}

ベースページ内

public abstract class ViewBasePage<TPresenter, TView> : 
        Page where TPresenter : Presenter<TView> where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = GetView(); // <- Works
            //_presenter.View = (TView)this; <- Doesn't work
        }
    }

    /// <summary>
    /// Gets the view. This will get the page during the ASP.NET
    /// life cycle where the physical page inherits the view
    /// </summary>
    /// <returns></returns>
    private static TView GetView()
    {
        return (TView) HttpContext.Current.Handler;
    }
}

私がする必要があるのは、実際に(TView)_Defaultをキャストすることです。私のGetView()メソッドを使用すると、実際にその結果で終了します。ベースページの中ではできません

_presenter.View = (TView)this;

これは実際にはViewBasePage<TPresenter,TView>そうなので、TViewだけに直接キャストすることはできません。

だから私の実際の質問は、ハッキーが少ないと感じる方法で結果を達成するための代替方法はありますか?これが主要なオプションである場合、このようにページを処理することによって本当に心配する必要があるものはありますか?

編集:

私が書き留めようとしている正確な部分は

private static TView GetView()
{
    return (TView) HttpContext.Current.Handler;
}

これは、このコンテキストでページに戻って参照できるようにするためのかなりひどいハックだと思います。

4

1 に答える 1

1

(TView)thisどのように機能すると予想される かわかりません。thisであるクラスを参照していPageます。Pageを に変換することはできませんIView

あなたの現在の実装はハッキーに見えません。

何か不足していますか?

編集:あなたの状況をもう少しよく理解できました。ViewBasePage を IView から継承する (そして _Default ページから削除する) のはどうですか?

EDITさらに、_Default ページにインターフェイスで定義された関数を実装する必要がある場合は、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(){}
}
于 2009-09-03T18:28:33.607 に答える