2011-06-02 86 views
3

我重构了一个在整个系统中使用Dictionary<int, SomeInterface>的C#库。 我需要将键类型从int更改为字符串,并使用Dictionary<string, SomeInterface>来代替,并且我正在进行几十项更改。 如何更好地做到这一点,如何在一个地方定义一个类型并在任何地方使用它,这样,如果以后需要更改它,我可以在一个地方更改它?重构字典,更改密钥类型

我已经为我的界面添加了一个GetKey()方法。

编辑:该库用于其他DLL,我想限制可能的更改只有一个库。这是一个敏捷的商店,所以我们需要为变化做好准备。

+6

这听起来像一个非常严重的变化,就像某些需要重新编写逻辑的东西。 – delnan 2011-06-02 20:12:40

+1

你是否真的期望经常改变钥匙类型?不要过度设计! – tofutim 2011-06-02 20:13:57

+1

有时候我会抓我的头... – Fosco 2011-06-02 20:18:43

回答

4

如果交换键的类型对您很重要,请考虑包装基础键的自定义类。

e.g,public class Key { public Key(object adaptee) { ... } }

记住要实现equals()和GetHashCode(),只是委托给底层的对象。

我不确定这是否有助于您的特定场景,但一般来说,Resharper是帮助完成这些类型更改的绝佳工具。

+0

这个工作,谢谢!我正在使用Resharper,它为我生成了一些此代码。 – 2011-06-03 14:20:36

1

创建你自己的KeyType是:

  • 一个struct
    • 包含的int字段
    • 具有转换器/从int(标记为过时)
    • 有GetHashCode()方法和平等()方法调用该方法
  • 开始使用keyType
  • 使用过时的编译器警告的GUID您
  • 一旦所有的Dictionarys使用新的关键字类型和你没有得到更多的obslete警告,然后转换为字段的类型中的KeyType
+0

什么是“过时的编译器警告”?我似乎没有得到任何。 – 2011-06-03 14:21:48

+0

@Arne,请参阅http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx它是一种让编译器在每个地方告诉你正在使用methed而不会破坏构建的方法。 – 2011-06-03 15:36:51

+0

Resharper向我展示了所有的用法。它认为使用它比较容易,除非我错过了一些东西。谢谢! – 2011-06-06 17:54:24