我有一个绑定源,可以绑定到A列表或B列表。根据它是A或B,当我单击“保存”时,我想调用相应存储库的save方法。
我能够创建此方法来检查是否有任何列表是脏的并且需要保存:
private static bool IsDirty<T>(TList<T> list) where T : IEntity, new()
{
foreach (var entity in list)
{
if (entity.IsDirty)
return true;
}
return false;
}
但是,我遇到以下问题:
var list = CurrentTList<A>();
和
private TList<T> CurrentTList<T>() where T: IEntity, new()
{
switch (currentRatesTable)
{
case RatesTables.A:
return (TList<T>) _bindingSourceMaster.List;
case RatesTables.B:
return (TList<T>) _bindingSourceMaster.List;
default:
return null;
}
}
这是从数据源获取当前列表的最佳方法吗?我想避免使用这样的开关,因为它看起来不对我:
switch (currentRatesTable)
{
case Form1.RatesTables.A:
var list = CurrentTList<A>();
case Form1.RatesTables.B:
var list = CurrentTList<B>();
// ...
}
答案 0 :(得分:2)
是的,正如Sayse所说,你需要一个接口和/或一个抽象类。如果有很多共享代码,你可以从后者开始。这是旧测试项目的重点。它需要一种不同的方法(集合中的每个项目都与“脏”的东西相关,并且有一些被删除的方法可以搜索集合中的那些),但是你应该能够根据需要进行调整:
[DataContract]
public abstract class Dirty : Object
{
protected bool _isdirty;
public bool IsDirty
{
get { return _isdirty; }
set
{
_isdirty = value;
}
}
public abstract class DataStore<T> where T : Dirty
{
private string _path;
private string _tempFile;
protected DataStore(string path, string tempfile)
{
_path = path;
_tempFile = tempfile;
}
}
因此DataStore拥有操纵这些列表的逻辑。我的想法是从Dirty继承的类都被序列化为JSON,因此只要它们的成员具有正确的属性,它们都被正确地序列化,因此每个类的存储没有自定义逻辑。因此,他们创建数据存储区所需要做的就是:
[DataContract]
public class Account : Abstracts.Dirty
{
#region DataStore fields and singleton
private static volatile StoreClass _store = new StoreClass();
protected static StoreClass Store
{
get
{
return _store;
}
}
/// <summary>
/// Store is the data store for the Account class. This holds the active list of Accounts in a singleton, and manages the push/pull to the JSON file storage.
/// </summary>
protected class StoreClass : Abstracts.DataStore<Account>
{
#region Singleton initialization and Constructor
public StoreClass()
: base("accounts.json", "TEMP_accounts.json")
{
}
#endregion
}
}
我只是从数据存储区中删除了这个项目上的几千行,但它非常疯狂。基本思想是在DataStore类中构建所需的逻辑以保存列表,并通过如何从StoreClass子类调用其构造函数来瞄准如何保存/加载它。