使用泛型用于视图模型

时间:2015-05-14 17:05:43

标签: c# asp.net-mvc generics

我有一个观点,我想给出一个模型,但该模型可能有两种类型。例如:

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>

这是否可行,我是在正确的轨道上,还是我只是做了一大堆什么?

2 个答案:

答案 0 :(得分:3)

让视图使用Super作为模型:

@model Super

您可以传递Sub1Sub2,因为它们都从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> *@