2009-10-22 175 views
0

有没有办法我可以指向另一个枚举枚举?下面是需求和细节:C#枚举指向另一个枚举(重构)

目前:

  • 我有两个公共类com.abcd.MyManager和com.abcd.data.MyObject。
  • MyObject类几乎所有东西都是私有的,除了Types枚举成员。
  • 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
    }

我如何能做到这一点不打破目前的结构有什么建议?谢谢。

+0

你的问题是开发人员如何使用MyManager的Init而不使用MyObject的命名空间? – 2009-10-22 13:47:58

回答

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 S之间浇铸,并得到了相同部件名称相同的值,但你仍然要投。

0

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

当您尝试重构时,是否遇到任何特定问题?

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来枚举不断变化,你需要记住,以及更新此代码,我不会建议。