C#Enum指向另一个枚举(重构)

时间:2009-10-22 13:41:19

标签: c# refactoring enums

有没有办法让Enum指向另一个Enum?以下是需求和细节:

目前:

  • 我有两个公共类com.abcd.MyManager和com.abcd.data.MyObject。
  • 除了类型枚举成员外,MyObject类几乎都是私有的。
  • MyManager类使用MyObject类
  • 注意MyObject类位于一个单独的命名空间中。
  • 其中一个MyManager方法有以下签名:
    public void Init(string name, MyObject.Types type)
    {
    // does Init
    }

重构要求:

  • 仅仅因为在Init方法中使用了MyObject.Types,而且它还存在于另一个命名空间中。开发人员必须在其代码中包含两个名称空间。我喜欢将MyObject.Types枚举移动到MyManager类。类似的东西:
    public void Init(string name, MyManager.Types type)
    {
    // does Init
    }

有关如何在不破坏当前结构的情况下执行此操作的任何建议?感谢。

3 个答案:

答案 0 :(得分:2)

你可以让一个enum使用另一个的值,但是你不能使它们可以互换(没有强制转换)。

public class MyManager
{
    public enum Types
    { 
        Type1 = com.abcd.data.MyObject.Types.Type1,
        Type2 = com.abcd.data.MyObject.Types.Type2,
        Type3 = com.abcd.data.MyObject.Types.Type3
    }
}

这将允许你在两个enum之间进行投射,并获得相同成员名称的相同值,但你仍然需要施放。

答案 1 :(得分:0)

我不明白为什么移动枚举会破坏任何东西。您应该只能将枚举移动到com.abcd.Types,并确保MyObject代码文件包含com.abcd命名空间的using指令。如果你真的想在MyManager中加入枚举,那么MyObject必须引用MyManager.Types而不是Types

尝试重构时,您遇到了哪些具体问题?

答案 2 :(得分:0)

我有两个建议。

1)将MyObject.Types枚举移动到MyObject和MyManager都引用的单独项目中。

2)在MyManager项目中创建一个与MyObject项目中的枚举匹配的枚举。然后你可以有某种映射方法:

public void Init(string name, MyManager.Types type)
{
   MyObject.Types t = type.ToMyObjectType();
}

internal static class Extensions
{
   public static MyObject.Types ToMyObjectType(this MyManager.Types t)
   {
      //do mapping
   }
}

我不建议使用第二种方法,因为如果MyObject中的枚举发生变化,您还需要记住更新此代码。