【问题标题】:Converting from base object to inherrited object从基础对象转换为继承对象
【发布时间】:2009-08-20 07:46:35
【问题描述】:

我正在尝试与您通常做的相反的方式。

我有两个 POCO 类 A 和 B,其中 B 继承自 A

public class A
{
   public int Foo { get; set; }
}

public class B : A
{
   public int Bar { get; set; }
}

B 是 A 的延伸,带有附加信息。

我从一个 A 类的实例开始

A a = new A { Foo = 1 };

然后我希望用附加信息扩展 A 类中的信息并获得最终的 B 类。我可以将 A 类中的每个属性映射到 B 类中的属性,但这对我来说没有多大意义:

A a = new A { Foo = 1 };
B b = new B { Foo = a.Foo, Bar = 2 };

或者在构造函数中

A a = new A { Foo = 1 };
B b = new B(a) { Bar = 2 }; // Mapping of value Foo is done in constructor of object B

结果是在其他情况下手动将值从对象 A 映射到 B。 必须有更聪明的方法来做到这一点......有什么建议吗?

【问题讨论】:

    标签: c# mapping poco


    【解决方案1】:

    如果您实际上是在更改类型(而不是强制转换) - 那么如果您只有几个类,那么只需编写转换代码 - 可能是接受模板 AB 的 ctor。如果你有很多类......你可以使用动态代码或序列化来做一些技巧。例如,MiscUtil 中的PropertyCopy 会这样做(使用动态的Expression 可以非常快速地完成工作):

    A a = new A { Foo = 1 };
    B b = PropertyCopy<B>.CopyFrom(a);
    b.Bar = 2;
    

    【讨论】:

    • Marc,我喜欢你使用反射的建议。我确实想到了这个想法,但我不想编写属性复制方法。感谢您提供指向 MiscUtil 的链接。它为我节省了宝贵的时间。
    【解决方案2】:

    我认为“智能”方式是您最后的建议 - 为 B 编写一个知道如何从 A 实例化自身的复制构造函数。

    【讨论】:

    • 恕我直言,这可能会导致维护噩梦。该示例非常简化。对于我当前的实现,我确实使用了最后一个建议。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2012-11-27
    • 2016-08-10
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多