V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Renewmm
V2EX  ›  C#

C# 如何使基类快速转换为派生类

  •  
  •   Renewmm · 2020-11-23 14:45:53 +08:00 · 3027 次点击
    这是一个创建于 1487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个基类

    public class ClassA{
    
        public string Str { get; set;}
        
    }
    

    一个继承自ClassA的派生类

    public class ClassB : ClassA{
    
        public string NewStr { get; set;}
        
    }
    

    当我想要从基类直接转成派生类时我唯一的想法只有从构造函数下手,就像这样

    public class ClassB : ClassA{
    
        public ClassB(ClassA obj){
        	this.Str = obj.Str;
        }
        
        public string NewStr { get; set;}
    }
    
    

    但是这很繁琐,有更好的办法吗?

    9 条回复    2021-04-27 14:53:48 +08:00
    rwecho
        1
    rwecho  
       2020-11-23 16:10:01 +08:00
    Renewmm
        2
    Renewmm  
    OP
       2020-11-23 18:53:32 +08:00
    @rwecho 看起来不错
    lukaz
        3
    lukaz  
       2020-11-24 20:42:37 +08:00 via Android
    序列化 A,再反序列化成 B
    PerFectTime
        4
    PerFectTime  
       2020-11-28 17:53:47 +08:00
    实在不行转 json 再转回去的骚操作也是可以 hhh
    yeqiu
        5
    yeqiu  
       2020-12-03 09:18:17 +08:00
    ???

    ClassA classAobj=new ClassA();
    ClassB chassBobj=(classAobj as ClassB)
    coder001
        6
    coder001  
       2020-12-05 01:50:45 +08:00 via Android
    没必要纠结于基类还是派生类型。
    用即兴接口来玩 duck typing,定义接口,然后实例.AciLike<接口>就能吃了

    https://github.com/ekonbenefits/impromptu-interface
    Renewmm
        7
    Renewmm  
    OP
       2021-04-27 13:21:44 +08:00
    @yeqiu "as" "is" 操作无法将基类转换为派生类,他们仅允许由派生类转换为基类
    yeqiu
        8
    yeqiu  
       2021-04-27 13:27:03 +08:00
    @Renewmm #7

    强制转换呢,ClassB chassBobj=(classAobj) as ClassB
    Renewmm
        9
    Renewmm  
    OP
       2021-04-27 14:53:48 +08:00
    @yeqiu as 就是强制类型转换 is 也有类型转换的功能 但是,他们不能让原先没有的 NewStr 变出来,因此,转换会失败,chassBobj 的结果是 null
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5337 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:30 · PVG 15:30 · LAX 23:30 · JFK 02:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.