2015-02-24 44 views
1

我有什麼如何正確隱藏基方法

public abstract class CustomWebViewPage<T> : WebViewPage<T> 
{ 
    public new CustomUrlHelper Url { get; set; } 

    public UrlHelper UUrl { get; set; } 

    public override void InitHelpers() 
    { 
     Url = new CustomUrlHelper(ViewContext.RequestContext);   

     UUrl = new UrlHelper(ViewContext.RequestContext); 

    } 
} 

public class CustomUrlHelper : UrlHelper 
{ 
    public CustomUrlHelper(RequestContext requestContext) : base(requestContext) 
    { 
    } 

    public CustomUrlHelper(RequestContext requestContext, RouteCollection routeCollection) : base(requestContext, routeCollection) 
    { 
    } 

    public string Action(string actionName) 
    { 
     return this.GenerateUrl(null, actionName, null, null); 
    } 
} 

需要寫這樣一個條件,即

if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);} 
else{Url = new UrlHelper(ViewContext.RequestContext);} 

但是:

如何組織投或隱藏,因爲這種結構不沒有道理

public new UrlHelper Url { get; set; } 

Url = new CustomUrlHelper(ViewContext.RequestContext) as UrlHelper; 

電話獨生子女構造函數,但沒有一種方法

UPD:基本方法Actionvirtual

回答

0

認爲你要找的東西只是Url = new CustomUrlHelper(ViewContext.RequestContext);

如果你只需要的單個實例每個CustomViewWebPage都有一個UrlHelper,這使得它過於複雜。對於所有的意圖和目的,繼承的好處是孩子是父母。在你的情況下,CustomUrlHelper是UrlHelper,所以你不需要兩者。使用此:

public abstract class CustomWebViewPage<T> : WebViewPage<T> 
    { 
     public UrlHelper Url { get; set; } 

     public override void InitHelpers() 
     { 
      if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);} 
      else{Url = new UrlHelper(ViewContext.RequestContext);} 

     } 
    } 

你不需要投下CustomUrlHelperUrlHelper,因爲它已經是一個(通過繼承)。

您還應該將新Action方法的簽名更改爲public override string Action(string actionName)

enter image description here

編輯:這是適用於.NET 4.5。如果您希望隱藏而不是.NET 4的覆蓋,那麼請忽略覆蓋修飾符。你仍然會以同樣的方式調用你的方法,如果你的實現是CustomUrlHelper,那麼它將調用你的自定義版本而不是基本方法。

+0

但基類中的'Action'方法不是'virtual' - 你的例子不起作用。 – AleksP 2015-02-24 18:20:20

+1

你在使用什麼UrlHelper?在System.Web.Mvc它當然是:https://msdn.microsoft.com/en-us/library/dd504960(v=vs.118).aspx – DrewJordan 2015-02-24 18:26:25

+0

但在元數據它看起來像這個公共字符串行動(字符串actionName,object routeValues);' – AleksP 2015-02-24 19:08:53