2011-04-23 62 views
0

我有一個關於傳統的體系結構問題。例如我有一個在項目中隨處可見的類。項目沒有任何單元測試支持傳統代碼中新財產的最佳方式

public class LegacyObject 
    { 
     public Dictionary<string, string[]> MyLegacyProperty { get;set;} 
    } 

我需要字典類型更改爲其他類型,例如IEnumerable<KeyValuePair<TKey, TValue>>。 什麼是最好的方式來改變它,並且不要改變MyLegacyProperty使用的字典代碼部分。

回答

1

那麼,Dictionary<T,U>確實實現IEnumerable<KeyValuePair<T,U>>,所以任何想要使用IEnumerable可以引用Dictionary屬性,它會工作。既然你想做出這樣的改變,我假設你想做一些字典不允許的事情,也許是重複鍵。

如果替換屬性可以轉換爲字典,我會做這樣的事情。你有沒有坐在新房產旁邊的舊房產,並處理舊房產的轉讓和吸引人。請注意,如果MyLegacyProperty的用例檢索它,對其進行修改並將其設置回來,則此模式將失敗;在這種情況下,你需要做類似ObservableCollection的事情。 (是否有ObservableDictionary?)

public class LegacyObject 
{ 
    public Dictionary<string, string[]> MyLegacyProperty 
    { 
     get { return ConvertMyNewProperty(); } 
     set { this.MyNewProperty = ConvertMyLegacyProperty(value); } 
    } 

    IEnumerable<KeyValuePair<string, string[]>> MyNewProperty { get; set; } 
} 

如果更換的屬性不能轉換爲字典,那麼你在談論作出真正改變你的類的外部接口。我不相信有任何東西可以替代咬人的子彈,並且在沒有向後兼容性的情況下做出改變。我可以給你的唯一提示是使新屬性與舊屬性名稱不同:您可以使用「查找文件」來查找需要更改的代碼,並且會導致編譯器錯誤你會得到清楚而明確的。

1

如果您可以使用新名稱創建新屬性,可以將舊名稱標記爲[Obsolete],並慢慢遷移您的代碼庫以使用新屬性,直到沒有對舊屬性的引用並且可以刪除它。

如果您必須使用舊的屬性名稱,並且該屬性僅在Visual Studio中的一個解決方案中使用,則可以使用重命名重構並將名稱更改爲MyLegacyProperty_Old之類的名稱,然後使用舊的名稱。

在這兩種情況下,爲你的班級編寫一些單元測試是個好主意。

相關問題