2011-04-23 26 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之类的名称,然后使用旧的名称。

在这两种情况下,为你的班级编写一些单元测试是个好主意。

相关问题