Функция, возвращающая список различных возможных дочерних классов
У меня есть источник привязки, который может быть связан со списком 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>();
// ...
}
1 ответ
Да, как говорит 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.