所以我试图将多态性应用于某个视图,并且我将此视图绑定到一个公共视图模型。这是我的基本抽象类:
public abstract class AnimalViewModel
{
public abstract IPagedList<object> Names { get; set; }
}
我有两个继承它的课程:
public class CatViewModel : AnimalViewModel
{
public override IPagedList<CatNameViewModel> Names { get; set; }
}
public class DogViewModel : AnimalViewModel
{
public override IPagedList<DogNameViewModel> Names { get; set; }
}
请注意,尽管我的例子,我的CatNameViewModel
和DogNameViewModel
绝对没有任何共同之处。
显然这不起作用,因为IPagedList<object>
的属性签名与IPagedList<DogNameViewModel>
的属性签名不匹配
我知道解决这个问题的正常方法是做这样的事情:
public abstract class AnimalViewModel<T>
{
public IPagedList<T> Names { get; set; }
}
public class CatViewModel : AnimalViewModel<CatNameViewModel>
{
}
public class DogViewModel : AnimalViewModel<DogNameViewModel>
{
}
但是这有两个问题,首先我传递一个实际上不是继承类型的泛型类型,其次,当我定义模型来绑定我的视图时,我仍然需要定义一个特定的类型来绑定它来:
@model AnimalViewModel // doesn't work, asks to define <T>
如果我尝试让DogNameViewModel : INameViewModel
和CatNameViewModel : INameViewModel
从公共接口继承并执行:
@model AnimalViewModel<INameViewModel> // doesn't work either
有没有其他方法可以使我的“Names”属性足够通用,可以将它放在我的抽象类中?
答案 0 :(得分:0)
声明模型时,需要指定具体类型,例如
@model AnimalViewModel< CatViewModel >
只需使用无界类型保留抽象类。
或者做@ganesh陈述(动态),这应该工作