代码之家  ›  专栏  ›  技术社区  ›  Bob Tway

如何将C类“转换”为具有只读属性的子类[duplicate]

  •  0
  • Bob Tway  · 技术社区  · 6 年前

    这似乎不应该工作(object被实例化为new base,因此不应该为派生类的额外成员分配内存),但C似乎允许我这样做:

    class BaseClass
    {
      ... some stuff ...
    }
    
    class DerivedClass : BaseClass
    {
        public bool MyDerivedProperty{ get; set; }
    }
    
    
    static void Main(string[] args)
    {
        BaseClass myBaseObject = new BaseClass();
        DerivedClass myDerivedObject = myBaseObject as DerivedClass;
    
        myDerivedObject.MyDerivedProperty = true;
    }
    
    0 回复  |  直到 12 年前
        1
  •  101
  •   Tim S.    12 年前

    不,没有像你说的那样转换类的内置方法。最简单的方法是按照您的建议来做:创建一个 DerivedClass(BaseClass) 建造师。其他选项基本上是自动将属性从基复制到派生实例,例如使用反射。

    你发布的代码 as 将编译,我确信您已经看到了,但是当您运行它时会抛出一个空引用异常,因为 myBaseObject as DerivedClass null ,因为它不是 DerivedClass .

        2
  •  54
  •   Mahmood Dehghan    9 年前

    那是不可能的。但是你可以使用像这样的对象映射器 AutoMapper

    例子:

    class A
    {
        public int IntProp { get; set; }
    }
    class B
    {
        public int IntProp { get; set; }
        public string StrProp { get; set; }
    }
    

    AutoMapper.Mapper.CreateMap<A, B>();
    

    用法:

    var b = AutoMapper.Mapper.Map<B>(a);
    

    它很容易通过一个流畅的API进行配置。

        3
  •  9
  •   rr-    11 年前

    我的基类

    public class MyBaseClass
    {
       public string BaseProperty1 { get; set; }
       public string BaseProperty2 { get; set; }
       public string BaseProperty3 { get; set; }
       public string BaseProperty4 { get; set; }
       public string BaseProperty5 { get; set; }
    }
    

    我的派生类

    public class MyDerivedClass : MyBaseClass
    {
       public string DerivedProperty1 { get; set; }
       public string DerivedProperty2 { get; set; }
       public string DerivedProperty3 { get; set; }
    }
    

    获取填充基类的上一个方法

    public MyBaseClass GetPopulatedBaseClass()
    {
       var myBaseClass = new MyBaseClass();
    
       myBaseClass.BaseProperty1 = "Something"
       myBaseClass.BaseProperty2 = "Something else"
       myBaseClass.BaseProperty3 = "Something more"
       //etc...
    
       return myBaseClass;
    }
    

    在我尝试这个之前,这给了我一个无法投射的错误

    public MyDerivedClass GetPopulatedDerivedClass()
    {
       var newDerivedClass = (MyDerivedClass)GetPopulatedBaseClass();
    
       newDerivedClass.UniqueProperty1 = "Some One";
       newDerivedClass.UniqueProperty2 = "Some Thing";
       newDerivedClass.UniqueProperty3 = "Some Thing Else";
    
       return newDerivedClass;
    }
    

    公共MyBaseClass GetPopulatedBaseClass()
    {
    var myBaseClass=新建myBaseClass();
    
    myBaseClass.BaseProperty2=“其他东西”
    myBaseClass.BaseProperty3=“更多”
    //等等。。。
    
    返回myBaseClass;
    

    新的

    public void FillBaseClass(MyBaseClass myBaseClass)
    {
       myBaseClass.BaseProperty1 = "Something"
       myBaseClass.BaseProperty2 = "Something else"
       myBaseClass.BaseProperty3 = "Something more"
       //etc...
    }
    

    公共MyDerivedClass GetPopulatedDerivedClass()
    {
    var newDerivedClass=(MyDerivedClass)GetPopulatedBaseClass();
    
    newDerivedClass.UniqueProperty1=“某个人”;
    newDerivedClass.UniqueProperty3=“其他一些东西”;
    
    返回newDerivedClass;
    }
    

    新的

    public MyDerivedClass GetPopulatedDerivedClass()
    {
       var newDerivedClass = new MyDerivedClass();
    
       FillBaseClass(newDerivedClass);
    
       newDerivedClass.UniqueProperty1 = "Some One";
       newDerivedClass.UniqueProperty2 = "Some Thing";
       newDerivedClass.UniqueProperty3 = "Some Thing Else";
    
       return newDerivedClass;
    }
    
        4
  •  6
  •   Matthias Meid    12 年前

    您可以自己实现转换,但我不建议这样做。看看 Decorator Pattern

        5
  •  1
  •   Erix    12 年前

    不,没有内置转换。

    另外,由于基类不是DerivedClass,myDerivedObject将为null,并且上面最后一行将抛出null ref异常。

        6
  •  1
  •   Jan P.    12 年前

    static void Main(string[] args)
    {
        BaseClass myBaseObject = new DerivedClass();
        DerivedClass myDerivedObject = myBaseObject as DerivedClass;
    
        myDerivedObject.MyDerivedProperty = true;
    }