我正在尝试将对象强制转换为该对象派生自其的父类型。
所以,我有这个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>
答案 0 :(得分:4)
至少在C#中,这些类至少当前不支持co-variance,并且看不到任何近期发生的情况。您可以做的是引入一个界面,例如:
public interface ICostsChargesViewModel<out T> where T : CostsChargesBasePage
,您的抽象类将实现它:
public abstract class CostsChargesViewModel<T> : ICostsChargesViewModel<T>
where T : CostsChargesBasePage
然后您就可以像下面这样写,并且可以完成课程:
var bar = Model as ICostsChargesViewModel<CostsChargesBasePage>;