枚举和两个“子枚举”

时间:2012-11-29 08:25:49

标签: c# architecture enums

这是一个建筑师的问题!

有两个有条件独立的枚举

enum OpenID
{
  Google,
  Aol
}

enum OAuth
{
  Facebook,
  Twitter
}

class Provider 
{ 
  public OpenID openid;
  public OAuth oauth;
}

将提供商的所有成员分为OpenID和OAuth是非常合乎逻辑的。

if(openid == null)//一个行为,If(oauth == null)//另一个行为。

将会有一系列需要对其进行排序的Provider实例。

有什么办法

  • 支持此部门(openid vs oauth)和

  • 向ARRANGE添加所有X成员任意的功能,例如: {Facebook,Google,Aol,Twitter} 没有实现3D枚举?

意思是,如果已将值添加到任何枚举,请说OAuth:     枚举OAuth     {       Facebook的,       推特,       Instagram的     }

不需要在代码中的其他地方显式写入此值(Instagram)来实际添加对排序的支持。

我牢记的想法:

  • 无论如何都有一个枚举,但添加前缀, 即枚举X {OpenID_Google,OpenID_Aol,OAuth_Facebook,OAuth_Twitter}。

缩小尺寸 - 无法使用枚举A(或B)特定操作进行操作。 现在我有一个bool变量来表示类型:bool IsOpenId; bool IsOAuth;

  • XML列表 {Facebook},意思是首先包括/处理Facebook,然后是OpenID的成员,然后是剩余的OAuth。

你有任何雷击的想法吗?甚至可能使用代码示例!

1 个答案:

答案 0 :(得分:1)

我想你可以做以下事情:

enum Provider
{
    None = 0,
    OpenID = 0x1,
    OAuth =  0x2,
    Google =   0x10 | OpenID,
    Aol =      0x20 | OpenID,
    Facebook = 0x30 | OAuth,
    Twitter =  0x40 | OAuth | OpenID // can set both flags!
}

static bool IsOpenID(Provider p)
{
    return (p & Provider.OpenID) == Provider.OpenID;
}
static bool IsOAuth(Provider p)
{
    return (p & Provider.OAuth) == Provider.OAuth;
}

通过这种方式,您可以为提供商定义排序顺序,而不管它们是OpenID还是OAuth

这意味着枚举的最后8位为每个auth类型提供8个潜在的“标志”,其中IsOpenID取最后一位,OAuth取倒数第二位;由0x40x8给出的空间可以为将来的扩展添加2个标记。进一步扩展需要对非标记值进行额外的尾随0

IsOpenID检查OpenID flag1还是0;同样IsOAuth检查OAuth标志。

因为标志使用枚举的 low 位,所以对这些值的任何排序都将反映“提供者ID”部分而不是标志。