【发布时间】:2013-11-11 12:11:17
【问题描述】:
我正在使用 ASP.NET MVC 4、Entity Framework 和 C# 制作一个 Web 应用程序,并且我正在编写抽象超类来封装实体模型和视图模型。虽然细节不是那么重要,但我的问题是我希望这些抽象类实现从任何给定视图模型映射到相应实体模型的函数,反之亦然。
我实际上已经使用泛型和反射实现了这样的方法,但是我想让它更整洁。我通过这样定义 EntityModel 类来完成所有工作:
public abstract class EntityModel
{
public TVM MapToViewModel<TVM, TEM>()
where TVM : ViewModel<TEM>, new()
where TEM : EntityModel, new()
{ (...) }
}
似乎没有必要将实体模型的类型作为参数发送,因为调用对象会知道它自己的类型并让调用代码指定它会导致愚蠢的错误,但我不知道如何摆脱它。将方法定义为
public TVM MapToViewModel<TVM>()
where TVM : ViewModel<EntityModel>, new()
看起来更整洁,但由于 EntityModel 是抽象的,因此会产生编译时错误。有没有办法告诉编译器它必须是 EntityModel 的派生而不是 EntityModel 本身?还是有其他更好的解决方案?
ViewModel 类非常相似,定义为:
public abstract class ViewModel<T>
where T : EntityModel, new()
它正在按预期工作。
【问题讨论】:
-
您是否使用接口而不是抽象基类获得任何好处?
-
我看不出接口有什么帮助,因为我想直接在父类中实际实现映射方法,而不是单独为每个子类实现。除此之外,我还有同样的问题,不是吗?
-
并行层次结构在 OO 语言中处理得不是特别好。此外,C# 缺乏虚拟方法的返回类型协方差。我不知道解决这个问题的好方法。考虑采用不太通用的方法。
标签: c# reflection generic-constraints