2015-05-14 40 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> *@