【发布时间】:2020-01-13 14:36:24
【问题描述】:
我正在尝试将一个对象强制转换为该对象派生自它的父类型。
所以,我有这个 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 的父类转换为 CostsChargesViewModel?
这有点像双重演员 - 本质上是这样做的一种方式:
Model as CostsChargesViewModel<FundCostPage as CostChargesBasePage>
【问题讨论】:
-
与协方差有关,c#中类不支持协方差
-
我很确定我以前见过这种情况
-
您不能将
IEnumerable<int>转换为IEnumerable<Object>,但您可以在IEnumerable<int>上调用Cast<object>()。根据您对bar的需求,您也许可以按照这些思路为您的类提供一个方法。
标签: c# generics inheritance casting abstract