У меня есть 2 независимых класса A и B, и у меня есть класс Storage, который управляет хранением объектов типа A и B.
Я пытаюсь абстрагировать код, который делает Store of A и B, однако я застрял из-за ковариации Списка, я не мог назначить List<object> objList = new List<A>();
в следующем коде.
[DataContract]
public class A {
public int UID;
}
[DataContract]
public class B {
public int UID;
}
public class Storage {
public void Store(A a) {
List<A> aList = ReadA();
if (aList == null) {
aList = new List<A>();
}
aList.Add(a);
WriteNodes(aList);
}
public void StoreB(B b) {
List<B> bList = ReadB();
if (bList == null) {
bList = new List<B>();
}
bList.Add(b);
WriteNodes(bList);
}
public List<A> ReadA() {
//deserializes from aFileName and returns List<A>
}
public List<B> ReadB() {
//deserializes from bFileName adn returns List<B>
}
private static void WriteNodes<T>(List<T> nodeList) {
FileStream fs = new FileStream(aFileName, FileMode.Create);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser =
new DataContractSerializer(typeof(List<T>));
ser.WriteObject(writer, nodeList);
writer.Close();
fs.Close();
}
}
Если вы посмотрите на методы StoreA и StoreB, они имеют общий шаблон, за исключением используемого типа. ReadA и ReadB не проблема, я мог бы просто взять тип в качестве другого параметра и создать одну функцию Read.
Так можно ли создать абстракцию для Store, чтобы я не заканчивал методами StoreA и StoreB?