我有一个观点,我想给出一个模型,但该模型可能有两种类型。例如:
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 :(得分:3)
让视图使用Super
作为模型:
@model Super
您可以传递Sub1
或Sub2
,因为它们都从Super
继承。
答案 1 :(得分:1)
Razor观点不支持通用模型 - 您可以使用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>
相关的任何形式) - 因此您无法指定&#34; base& #34;泛型类,并为派生类提供合理的工作。以下模型甚至不允许传递Generic<Sub1>
(您可以使用界面处理 - 阅读&#34;泛型和协方差&#34;)
@model Generic<Super> @* can't pass instance of Generic<Sub1> *@