【发布时间】:2011-02-17 21:17:57
【问题描述】:
在尝试实现存储库模式时,我遇到了一个小问题,我担心它实际上掩盖了更大的问题。
我有一个 DatabaseEntity<T>,我用它来处理所有基本的 CRUD 操作,并且所有其他需要存储在数据库中的类都将从它继承下来。对于直接从它继承的类来说,它工作得很好,但是在将它与具有中间父级的类一起使用时,我遇到了问题。
假设我还有其他三个类,Parent、ChildA 和 ChildB,并且继承看起来像:
数据库实体
|
家长
| |
孩子A 孩子B
同时假设 DatabaseEntity<T> 有一个带有以下签名的方法:
public static T FindBy(int id)
我遇到的问题是当我尝试类似:
ChildA Foo = ChildA.FindBy(SomeID);
我收到一个编译器错误,告诉我没有从 Parent 到 ChildA 的隐式转换。这是因为 Parent 是为 ChildA 和 ChildB 传递给 DatabaseEntity 的类型参数的类。我认为很容易解决,只需向 Parent 添加一个类型参数,从而传递适当的类型。等一下,然后我必须在任何时候使用破坏任何多态性的 Parent 显式定义子类型。不,再想一想,也许这不是一个很好的解决办法。
我认为我可以将类型参数放在类 DatabaseEntity 本身上,并让每个方法都需要一个类型参数,但是我必须这样做:
ChildA Foo = ChildA.FindBy<ChildA>(SomeID);
虽然可以编译,但它看起来不太干净,当然需要更多的输入。 Visual Studio 会询问我是否遗漏了演员表,虽然我可以直接转换我的第一个示例,但在我意外输入之前只是时间问题:
ChildB Foo = (ChildB) ChildA.FindBy(SomeID)
到目前为止,我对我想到的任何解决方案都不是特别满意,我希望这里有人能指出我错过的优雅解决方案。
【问题讨论】:
-
您受限于哪个 .Net 版本?
-
你需要一个支持LINQ操作的ORM,然后你可以使用
OfType<T>来做parent到childa的转换。