使用泛型将对象转换为其父类型
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>;
我正在尝试将一个对象转换为该对象派生自的父类型。
所以,我有这个 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>;