2012-06-20 60 views
4

可能重複:
Interface defining a constructor signature?強制執行默認的構造函數的

我的類和接口的混合層次。

對於使用序列化,我需要在每個類 存在一個默認的構造函數。如果編譯器可以告訴我默認的構造函數在層次結構中某處丟失,我真的會感到欣慰。 (看到問題在編譯時,而不是在後來的測試)

我想有什麼可能是一些標記或屬性, ,但我找不到任何東西。

喜歡的東西:

[ForceDefaultConstructor] 
interface IVeryQuickSerializable 
{ 
    Serialize(); 
    Deserialize(); 
} 

將是巨大的!

但是非常感謝。

有一個限制:我無法更改序列化。 使其通用將解決問題,但我沒有 的來源。編寫一個封裝器可能會完成這項工作,但它會爲來自頂級序列化接口(可能不會改變)的對象產生漏洞。

+0

不存在抱歉。 :) – albertjan

+0

假設所有東西都來自'Object',它已經有一個默認的構造函數。也許我在這裏錯過了一些東西? –

+0

@DavidLively構造函數不會被繼承; 'Foo {public Foo(int i){...}'不**沒有無參數的構造函數 –

回答

6

你不能在接口或屬性中做到這一點。

兩個想法:

  • 集成測試:使用反射來找到所有相關的類,並檢查它們在測試
  • 暴露您的序列代碼在使用T : new()子句的通用API,即

    void Serialize<T>(T obj, ...) where T : IVeryQuickSerializable, new() 
    
+0

編寫一個包裝是一個部分解決方案,但也許是最快的。謝謝。 –

+0

+1進行集成測試,我多次對它們進行了類似的使用。上次是幾天前,以確保給定的一組類使用自定義屬性的一致組合進行裝飾。 –

+0

是的,我在這些測試中閱讀得越多,我越喜歡這個想法。我們已經有了一些比較大的測試,但是這個測試不見了。 –

0

有最有可能是更好的解決方案,但你可以編寫一個應用程序THA t在構建後事件期間使用反射來檢查程序集。