2014-01-29 107 views
0

我有一個Derived類型的對象,但想要有一個Base類型的對象。通常,我可以簡單地將對象投射到Base的引用。但是,對於我的WCF服務,我真的只想公開Base類。從C#派生類對象創建新的基類對象#

有一種巧妙的方法(從Derived對象或創建一個新的Base)獲得BaseDerived對象,其動態類型爲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 
+0

你可以添加一個小代碼示例,說明情況?如果你不想讓用戶有機會將'Base'轉換爲'Derived',那麼我認爲用Derived'屬性創建一個新的'Base'是個很好的解決方案。 –

+0

你可以添加一個例子嗎?我真的不明白。 – Grzenio

+0

我已經添加了一個例子。 –

回答

0

如果沒有別的來了,我要接受我自己hackaround的解決方案:使用AutoMapper克隆Derived到一個新的Base

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

如果你要實現的目標是隱藏Derived類的額外屬性,則有兩種選擇

  1. 無論是消費者允許您指定請明確鍵入
  2. 或者您必須更改設計。

在第二種情況下,您應該考慮使用組合而不是繼承,例如,

  • 包裹BaseDerived對象到一個新的適配器類,它只會暴露所需的性能
  • 有基類,因爲它是,但而不是由它派生,使用成分添加額外的功能: Base類將包含另外一個將定義行爲方面的對象。

如果沒有具體的例子我很難幫助你。

+0

(1)正如我所說的,消費者是WCF。我不知道是否可以明確指定類型。 (2)我真的不想這麼做:添加一個新的適配器類會導致我爲數百個屬性編寫適配器,組合會導致非常糟糕的WSDL合約。 –

+0

@ D.R。,恐怕你需要更詳細些。我當然不是WCF的專家,但上次我使用它時,我必須在每個我想要序列化的屬性上設置屬性? – Grzenio