2012-05-16 55 views
0

派生抽象的泛型類屬性我有一個從一個抽象的泛型類,這是從System.Web.UI.Page派生派生兩班。我有一個System.Web.UI.MasterPage可能會或可能不會對我的任何兩個派生頁面類,或System.Web.UI.Page的主人。母版需要從System.Web.UI.Page

問題是泛型類有一個屬性,我需要在我的MasterPage中訪問,但我不知道任何優雅的方式來獲取它。

下面是一個例子...

內容類型:

public abstract class Fruit 
{ 
    public int ID { get; set; } //Just an identifier 
} 

public class Apple : Fruit { } 

public class Banana : Fruit { } 

頁:

public abstract class FruitPage<T> : System.Web.UI.Page where T : Fruit 
{ 
    public T MyFruit { get; set; } 
} 

public class ApplePage : FruitPage<Apple> { } 

public class BananaPage : FruitPage<Banana> { } 

站長:

public partial class FoodMaster : System.Web.UI.MasterPage 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     if (this.Page is FruitPage<Fruit>) //I know this is wrong 
     { 
      if ((this.Page as FruitPage<Fruit>).MyFruit.ID <= 0) //This too 
      { 
       /* 
        I want to get here (this.Page being an ApplePage or BananaPage). 

        Basically... if ID<=0 then it is a new (unsaved) "fruit", 
         and I need to change some MasterPage GUI accordingly. 
       */ 
      } 
     } 
    } 
} 

謝謝!

+0

你放在'FoodMaster'的代碼確實屬於在FruitPage ...那麼你不會有這個問題。它在任何其他情況下都不適用。 – Crisfole

+0

我也想過,但我可能應該提到這一點,我使用嵌套的主人。 「FoodMaster」實際上是「FoodFruitMaster」的「父母」。我想過加入'FoodMaster'的方法,並呼籲從頁面的方法,但它會冒泡通過'FoodFruitMaster'。我認爲這是sl。。 – Null

回答

2

"Any problem in computer science can be solved with another level of indirection."

public class FruitPage : System.Web.UI.Page { 
    public Fruit MyInnerFruit { get; protected set; } 
} 

public abstract class FruitPage<T> : FruitPage where T : Fruit 
{ 
    public T MyFruit { 
    get { return (T)MyInnerFruit; } 
    set { MyInnerFruit = value; } 
    } 
} 

public partial class FoodMaster : System.Web.UI.MasterPage { 
    protected override void OnLoad(EventArgs e) { 
     base.OnLoad(e); 

     var fruitPage = this.Page as FruitPage; 
     if (fruitPage != null && fruitPage.MyInnerFruit.ID <= 0) { 
      ... 
     } 
    } 
} 

你也可以陰影MyInnerFruit/MyFruit - 但它更容易理解沒有。

如果您使用.NET 4,你也可以使用一個協接口基本上允許鑄件從FruitPage<Apple>FruitPage<Fruit>

public interface IFruitPage<out T> where T : Fruit { 
    public T MyFruit { get; } 
} 

public class FruitPage<T> : Page, IFruitPage<T> where T : Fruit { 
    public T MyFruit { get; set; } 
} 

public class FoodMaster : MasterPage { 
    protected override void OnLoad(EventArgs e) { 
     base.OnLoad(e); 

     var fruitPage = this.Page as IFruitPage<Fruit>; 
     if (fruitPage != null && fruitPage.MyFruit.ID <= 0) { 
      ... 
     } 
    } 
} 
+0

「基本上允許從'FruitPage '轉換爲'FruitPage ''」 這是票據。謝謝! – Null