我有像Ship
,等实体的类,它们每个都有一个像Shampoo
,等的管理器类。所有管理器类都实现和实体实现。Horse
ShipManager
ShampooManager
HorseManager
IManager
IEntity
现在我写了一个静态函数来保存看起来像这样的实体:
public static bool Save<S, T>(S entity, string msg) where S : IEntity
where T : IManager<S>, new()
{
string possibleError;
switch (new T().Save(entity, out possibleError))
{
//---------------------
}
return true;
}
这里的不雅点是我必须调用Save
类似Save<Radio, RadioManager>
等。我想要的是这样的:
public static bool Save<T>(T entity, string msg) where T : IEntity
{
string possibleError;
switch ((/*find manager here*/).Save(entity, out possibleError))
{
//---------------------
}
return true;
}
有几种方法可以做到这一点,但我希望有一些涉及泛型和类型推断的东西。我认为最好通过设计将实体类与相应的管理器类结合起来,以实现某种类型的安全性。
在扩展方法的帮助下,这是我可以做的:
public static bool Save<T>(this IManager<T> mgr, T entity, string msg) where T : IEntity
{
string possibleError;
switch (mgr.Save(entity, out possibleError))
{
//---------------------
}
return true;
}
这样我就可以打电话了:
FooManager fMgr = new FooManager();
fMgr.Save(foo, "success");
但是在这里我总是需要实例化IManager
然后调用Save
它的实例上的方法。我很想避免那么多重复的代码,并将责任交给静态函数。如何设计类以使其之间具有关系IManager
,IEntity
以便自动推断实体的管理者?
编辑:请注意,我没有将Save
管理器类中的方法移动到实体类的奢侈(这会使生活更轻松)。我们的整个设计基于一个实体类和一个相应的管理器类。所以我想坚持下去。