【问题标题】:Create new base class object from derived class object in C#在 C# 中从派生类对象创建新的基类对象
【发布时间】:2014-01-29 11:16:49
【问题描述】:

我有一个Derived 类型的对象,但我想要一个Base 类型的对象。通常,我可以简单地将对象转换为Base 的引用。但是,对于我的 WCF 服务,我真的只想公开 Base 类。

有没有一种巧妙的方法可以将Base 获取到Derived 对象(或从Derived 对象创建一个新的Base),其中动态类型为Base

例子:

myWcfResult.PropertyOfTypeBase = objectOfTypeDerived; // do some magic in this line
Assert.Trace(myWcfResult.PropertyOfTypeBase.GetType() == typeof(Base)); // should hold afterwards
// or at least WCF should be able to serialize it correctly into an XML element of type Base

【问题讨论】:

  • 你能添加一个小代码示例来澄清情况吗?如果您不想让用户有机会将Base 转换为Derived,那么我认为使用Derived 的属性创建一个新的Base 是一个很好的解决方案。
  • 你能添加一个例子吗?我真的不明白。
  • 我添加了一个例子。

标签: c# wcf types type-conversion


【解决方案1】:

如果您想要实现的是隐藏Derived 类的额外属性,那么有两种选择

  1. 消费者允许您明确指定类型
  2. 或者你必须改变你的设计。

在第二种情况下,您应该考虑使用组合而不是继承,例如

  • BaseDerived 对象包装到一个只公开所需属性的新适配器类中
  • 让 Base 类保持原样,但不要通过从它派生来添加额外功能,而是使用组合:Base 类将包含另一个对象,该对象将定义行为的某些方面。

恐怕没有具体的例子很难帮助你。

【讨论】:

  • (1) 正如我所说,消费者是 WCF。我不知道是否可以明确指定类型。 (2) 我真的不想这样做:添加一个新的适配器类导致我为数百个属性编写一个适配器,组合导致一个糟糕的 WSDL 契约。
  • @D.R.,恐怕您需要更详细一些。我当然不是 WCF 方面的专家,但上次我使用它时,我必须在我想要序列化的每个属性上设置属性?
【解决方案2】:

如果没有其他问题,我将接受我自己的 hackaround 作为解决方案:使用 AutoMapper 将 Derived 克隆到新的 Base 中:

Mapper.CreateMap<Base,Base>();
Mapper.Map<Base,Base>(objectOfTypeDerived);

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2020-08-06
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多