使用泛型将对象转换为其父类型

Cast object to it's parent type with generics

我正在尝试将一个对象转换为该对象派生自的父类型。

所以,我有这个 ViewModel

public abstract class CostsChargesViewModel<T> where T : CostsChargesBasePage

我有一个派生自它的 FundCostPageViewModel:

public class FundCostPageViewModel : CostsChargesViewModel<FundCostPage>

我分别得到了 FundCostPage,它继承自 CostsChargesBasePage

public class FundCostPage : CostsChargesBasePage

所以 - 在拥有 FundCostPageViewModel 实例的上下文中,我希望能够将其转换为 CostChargesViewModel<CostsChargesBasePage>

例如,假设它是这样的 Razor 视图设置:

@model TSC.Website.Core.ViewModel.Pages.FundCostPageViewModel

var foo = Model as CostsChargesViewModel<FundCostPage>; // This would work

var bar = Model as CostsChargesViewModel<CostsChargesBasePage>; // Won't work 

如何将 FundCostPage 的父级 class 转换为 CostsChargesViewModel?

这有点像双重演员 - 本质上是一种做到这一点的方法:

Model as CostsChargesViewModel<FundCostPage as CostChargesBasePage>

classes 至少目前在 C# 中不支持 co-variance,而且近期不会发生这种情况。你可以做的是引入一个接口,如:

public interface ICostsChargesViewModel<out T> where T : CostsChargesBasePage

您的摘要 class 将实现它:

public abstract class CostsChargesViewModel<T> : ICostsChargesViewModel<T>  
                                       where T : CostsChargesBasePage

然后你就可以像下面这样写并且当然可以工作:

var bar = Model as ICostsChargesViewModel<CostsChargesBasePage>; 

See this DEMO Fiddle