函数返回不同可能子类的列表

时间:2013-08-07 15:05:59

标签: c# bindingsource

我有一个绑定源,可以绑定到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>();
    // ...
}

1 个答案:

答案 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子类调用其构造函数来瞄准如何保存/加载它。