通用<t> ActionResult与T的子项不是泛型类型

时间:2018-02-20 13:38:04

标签: c#

我参考this topic的第二个答案。

我在我的项目中写了这样的东西:

public class DetailsViewModel<T> where T : Standard
{
   public IList<T> OrderLines { get; set; }
}

public class Standard
{}

public class InitialStandard : Standard {}

public class AlteredStandard : Standard {}

public class InitialDetailsViewModel : DetailsViewModel<InitialStandard>
{}

public class AlteredDetailsViewModel : DetailsViewModel<AlteredStandard>
{}

然后我有两种方法可以引用一个ActionResult:

public void DetailsInitial(long Id)
{
    Details<InitialDetailsViewModel>(orderId);
}

public void DetailsAltered(long Id)
{
    Details<AlteredDetailsViewModel>(orderId);
}

public ActionResult Details<T>(long Id) where T : DetailsViewModel<Standard>
{
    var model = Mapper.Map<T>(order);
    return model;
}

如果这些方法不是通用的,如何将这种方法用于DetailsViewModel个孩子?

我注意到映射的差异在InitialStandardAlteredStandard类的配置文件中。

1 个答案:

答案 0 :(得分:2)

我不完全确定,但我认为你正在寻找这个:

public void DetailsInitial(long Id)
{
    Details<InitialDetailsViewModel, InitialStandard>(orderId);
}

public void DetailsAltered(long Id)
{
    Details<AlteredDetailsViewModel, AlteredStandard>(orderId);
}

public ActionResult Details<T, U>(long Id) 
    where T : DetailsViewModel<U> 
    where U : Standard
{
    var model = Mapper.Map<T>(order);
    return model;
}

在此,您要说T继承DetailsViewModel<U> U继承Standard