C# 通过使用基类方法但不向下转换,减少派生类中加载和保存方法的代码

C# 通过使用基类方法但不向下转换,减少派生类中加载和保存方法的代码,c#,inheritance,clone,C#,Inheritance,Clone,我试图简化几个类的加载和保存方法,这些类基本上是基类,只有几个新字段。所有派生类都使用所有基类的字段,因此它们的加载/保存方法包括基类的加载/保存代码,并添加一些行来处理派生类剩余的未处理字段 我的第一个想法是,我可以将一个实例作为基类加载,向下转换到派生类,然后继续加载其余的字段,但显然不能在C#中向下转换到派生类。经过一番思考,我想也许我可以遍历基类的所有字段成员,并将这些字段值复制到派生类的新实例上,但我不确定这是最好(或最快)的方法 基本上,我想做的是加载基类的实例,将其转换为派生类,然

我试图简化几个类的加载和保存方法,这些类基本上是基类,只有几个新字段。所有派生类都使用所有基类的字段,因此它们的加载/保存方法包括基类的加载/保存代码,并添加一些行来处理派生类剩余的未处理字段

我的第一个想法是,我可以将一个实例作为基类加载,向下转换到派生类,然后继续加载其余的字段,但显然不能在C#中向下转换到派生类。经过一番思考,我想也许我可以遍历基类的所有字段成员,并将这些字段值复制到派生类的新实例上,但我不确定这是最好(或最快)的方法

基本上,我想做的是加载基类的实例,将其转换为派生类,然后完成其余字段的加载

在派生类的Load和save方法中是否有保存相同代码行的方法,这些方法包括基类中的所有Load和save代码,而无需向下转换

下面是一些示例代码(实际的代码只长几倍):

类基
{
int i;
静态基本荷载(dic)
{
基b=新基();
b、 i=(int)dic[“i”];
返回b;
}
}
派生类:基
{
浮动f;
静态衍生荷载(dic)
{
派生d=新派生();
d、 i=(int)dic[“i”];
d、 f=(浮动)dic[“f”];
返回d;
}
}

你不能。猫和狗总是动物,但动物可以是猫或狗。无法将猫变形为狗。

我认为您正在寻找常规序列化代码:

 class Base 
 {  
     public int Field1 {get;set;}
     virtual void Load(BinaryReader reader)
     {
         Field1 = reader.ReadInt();
     }
 }
 class Derived:Base
 {  
     public int Field2 {get;set;}
     override void Load(BinaryReader reader)
     {
         base.Load(reader);
         Field2 = reader.ReadInt();
     }
 }
其用法类似于:

 Base toRead = new Derived();
 toRead.Load(reader);

到目前为止,我认为您需要显示您的代码。到目前为止,我完全按照所描述的那样做− 派生类的方法包含基类的代码以及一些新行来处理它们自己的字段。您的问题是:在执行派生类的加载/保存时如何从基类调用加载/保存方法?@AlexeiLevenkov我的问题是如何在派生类方法中不调用与基类完全相同的代码,但不知何故,我们可以利用基类的方法完成这项工作。@user1306322如果没有代码,我们所能做的就是告诉您这是不可能的。如果您发布代码,我们将更容易帮助您找到解决问题的正确方法。我正在尝试将动物变形为猫(或狗)是的,我正在寻找类似的东西。等等,我可以在静态加载方法中调用base方法吗?因为我想我不能。@user1306322-通常创建派生类的实例,然后调用其Load/Read/Serialize实例方法。通常,此类方法是虚拟的,因此您需要知道类型的唯一地方是对象的创建(无论如何,您必须在该点上知道类型,即通过将类型写入流/具有特殊属性为您提供类型)@user1306322,或者如果你想坚持使用
静态方法
,只需将创建和加载分离,并从派生方法调用基类方法
加载
。这不是必需的,我只是将其更改为非静态方法,就像Save方法一样,并且它工作正常。谢谢你的帮助。
 Base toRead = new Derived();
 toRead.Load(reader);