如何定义通用的通用类型属性?

时间:2014-03-21 18:09:45

标签: c# .net asp.net-mvc generics inheritance

所以我试图将多态性应用于某个视图,并且我将此视图绑定到一个公共视图模型。这是我的基本抽象类:

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; }    
}

请注意,尽管我的例子,我的CatNameViewModelDogNameViewModel绝对没有任何共同之处。

显然这不起作用,因为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 : INameViewModelCatNameViewModel : INameViewModel从公共接口继承并执行:

@model AnimalViewModel<INameViewModel> // doesn't work either

有没有其他方法可以使我的“Names”属性足够通用,可以将它放在我的抽象类中?

1 个答案:

答案 0 :(得分:0)

声明模型时,需要指定具体类型,例如

@model AnimalViewModel< CatViewModel > 

只需使用无界类型保留抽象类。

或者做@ganesh陈述(动态),这应该工作