2015-05-14 69 views
0

我有一個觀點,我想給模型,但模型可能是2種類型的可能。例如:使用泛型查看模型

public class Super { 
    public string Name = "super"; 
} 
public class Sub1 : Super { 
    public string Name = "sub1"; 
} 
public class sub2 : Super { 
    public string Name = "sub2"; 
} 

我試圖與仿製藥進行試驗,看我看我可以做下面的一些其他問題,不過,我是不是正確的聲明類中的變量?

public class Generic<T> where T : Super { 
    public T SubClass { get; set; } //is this ok? 
} 

如果這是好的,我該如何將這樣的類作爲模型添加到視圖?

@model Generic<??> 
<div>@Model.SubClass.Name</div> 

這是甚至可行的,我是在正確的軌道上,還是我只是做一大堆什麼都沒有?

+0

我不認爲你需要爲這個仿製藥。用'Super'替換'T'。 – Matthew

+0

你可以這樣做,但我在這裏沒有看到任何令人信服的理由。也許你需要添加更多,更具體的上下文?另外,重新聲明'Name'會隱藏基類中的成員,並且可能不會像您期望的那樣工作。 –

回答

3

只要有您的視圖使用Super作爲模型:

@model Super 

您可以通過其中Sub1Sub2的,因爲它們都來自Super繼承。

1

剃刀視圖不支持通用模型 - 您可以具有特定通用像IEnumerable<int>,但不能有IEnumerable<T>

它看起來像你真的想要與虛擬方法的常規繼承,而不是泛型。

public class Super { 
    public virtual string Name {get {return "super";}} 
} 
public class Sub1 : Super { 
    override public string Name {get {return "sub1";}} 
} 

而且只需使用Super類型模型

@model Super 
<div>@Model.Name</div> 

附加說明:普通類沒有繼承關係彼此(Generic<Super>不涉及Generic<Sub1>形式的任何形狀) - 讓你不能指定「基礎」泛型類併爲派生類提供合理的工作。下面的模型甚至不會放行Generic<Sub1>(你可以處理與接口 - 在「仿製藥和協方差」讀)

@model Generic<Super> @* can't pass instance of Generic<Sub1> *@