Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数据库加载类的最佳方法(C#)_C# - Fatal编程技术网

从数据库加载类的最佳方法(C#)

从数据库加载类的最佳方法(C#),c#,C#,我有以下场景:我说的是一个车辆类,每个车辆组件有几个字段: public WheelBase Wheels; public EngineBase Engine; public TrainBase DriveTrain; 对于每个汽车组件,都有几个从基类继承的类,例如,我们可能有:V8Engine:EngineBase、V6Engine:EngineBase、I6Engine:EngineBase等等 如果我想在标准数据库(如文本文件)中保存汽车的装载,并且当我需要装载汽车时,我需要知道应该装载

我有以下场景:我说的是一个车辆类,每个车辆组件有几个字段:

public WheelBase Wheels;
public EngineBase Engine;
public TrainBase DriveTrain;
对于每个汽车组件,都有几个从基类继承的类,例如,我们可能有:V8Engine:EngineBase、V6Engine:EngineBase、I6Engine:EngineBase等等

如果我想在标准数据库(如文本文件)中保存汽车的装载,并且当我需要装载汽车时,我需要知道应该装载哪个组件的“子类型”。例如,我想装载一辆有V6发动机:发动机座、夏季轮胎车轮:轴距、手动火车:火车座的汽车

存储和检索此信息的最佳方式是什么?我能想到的唯一方法是在数据库中保存“子类型”的名称,并使用一组开关来创建正确类型的组件,例如:

switch(EngineType)
{
  case "V8Engine" : 
    Engine = new V8Engine();
    break;
  case "V6Engine" :
    Engine = new V6Engine();
    break;
  case "I6Engine" :
    Engine = new I6Engine();
    break;
}

这种方法当然有效,但我觉得很难看。有没有更优雅的方法来处理这种情况?

我认为最好的方法是XML序列化和反序列化

XmlSerializer serializer = new XmlSerializer(typeof(List<MyClass>));

using(FileStream stream = File.OpenWrite("filename"))
{
    List<MyClass> list = new List<MyClass>();
    serializer.Serialize(stream, list);
}

using(FileStream stream = File.OpenRead("filename"))
{
    List<MyClass> dezerializedList = 
        (List<MyClass>) serializer.Deserialize(stream);
}
XmlSerializer serializer=新的XmlSerializer(typeof(List));
使用(FileStream-stream=File.OpenWrite(“文件名”))
{
列表=新列表();
序列化(流,列表);
}
使用(FileStream-stream=File.OpenRead(“文件名”))
{
列表DeserializedList=
(列表)序列化程序。反序列化(流);
}

另请参见此链接:(如何使用继承进行序列化和反序列化)

您更喜欢哪种模式,DataTable DataSet还是Linq/EF。@用户,如果要将其保存到标准rdbms,请参见以下问题:。简言之,枚举是一个很好的选择。我很想使用序列化,但事实是由于我的工具的限制,我无法使用它:),因此序列化是毫无疑问的。@user2503766您有哪些可用的工具?你有什么样的数据库和/或文件访问权限?你的原始代码并不是一个很好的方法——它基本上是EF和其他ORM中每个层次结构的表的工作方式。()