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

时间:2019-09-11 17:57:14

标签: c# generics inheritance casting abstract

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

所以,我有这个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>

1 个答案:

答案 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>; 

See this DEMO Fiddle