出于学习目的,我正在尝试用 C# 制作自己的简单数据库。我已经编写了代码来存储和加载一个表(类“披萨”)。很简单,因为逻辑是硬编码的——它只支持“Pizzas”类型的实例。不,我想概括我的数据库逻辑。这是我到目前为止所做的(简化):
请注意:我有一个抽象类的唯一原因是因为在 MyDB 类中,我无法输入
List<MyTable<T>> _tables;
有没有更好的方法将我的表格保存在列表中?一个接口代替?
public class MyDB
{
public List<MyTable> _tables;
public MyDB() {_tables = new List<MyTable>();}
public void AddTable(MyTable table) {_tables.Add(table);}
}
public abstract class MyTable
{
protected MyTableDefinition _tableDefinition;
public abstract void Save();
}
class MyTable<T> : MyTable
{
public List<T> _rows;
public MyTable()
{
_rows = new List<T>();
_tableDefinition = new MyTableDefinition(typeof(T));
}
internal void AddRecord(T record) {_rows.Add(record);}
internal void RemoveRecord(T record) {_rows.Remove(record);}
public override void Save() {Debug.WriteLine("Work in Progress...");}
}
public class MyTableDefinition { /* bla bla */ }
这实际上按我的意图工作。现在,我的问题是我的班级应该处理磁盘的读写。我认为将它分开可能是个好主意,这样我就可以处理不同的平台(常规文件、独立存储、存储文件等)。
public static class MyIOforFile
{
List<Stream> _tableStreams;
public static Test(MyDB database)
{
string tmpPath = @"C:\tmp";
foreach (var table in database._tables)
{
using (var file = new BinaryWriter(File.Open(tmpPath + @"\SampleOutput.txt", FileMode.Create)))
{
// Problem: Can't access _rows here.
foreach (var item in table._rows)
{
// ...
}
}
}
}
}
注意:在我的情况下,反射是访问 _rows 的唯一方法吗?在 OOP 中是否有合适的方法来处理我的场景(不是反射的忠实粉丝)?
这就是我调用代码的方式:
var testdb = new MyDB();
var PizzaTable = new MyTable<PizzaItem>();
testdb.AddTable(PizzaTable);
MyIOLayer.Test(testdb);
感谢您的关注!