3

我有一个绑定源,可以绑定到 A 列表或 B 列表。根据它是 A 还是 B,当我单击“保存”时,我想调用相应存储库的保存方法。

我能够创建这个方法来检查是否有任何列表是脏的并且需要保存:

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>();
    // ...
}
4

1 回答 1

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 子级调用其构造函数的方式来确定如何保存/加载它。

于 2013-08-07T15:38:10.237 回答