0

这是一个建筑师的问题!

有两个条件独立的枚举

enum OpenID
{
  Google,
  Aol
}

enum OAuth
{
  Facebook,
  Twitter
}

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

将 Providers 集的所有成员分成 OpenID 和 OAuth 对我来说是非常合乎逻辑的。

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

将有一组需要排序的 Provider 实例。

有没有什么办法

  • 支持这个部门(openid vs oauth)和

  • 添加功能以任意安排所有 X 成员,例如 { Facebook、Google、Aol、Twitter} 而不实施 3D 枚举?

意思是,如果一个值被添加到任何枚举中,比如说 OAuth: enum OAuth { Facebook, Twitter, Instagram }

无需在代码中的其他位置显式写入此值(Instagram)以实际添加对排序的支持。

我牢记的想法:

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

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

  • XML 列表 { Facebook },表示首先包含/处理 Facebook,然后是 OpenID 的成员,然后是 OAuth 的其余部分。

你有什么惊天动地的想法吗?甚至可能有代码示例!

4

1 回答 1

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 位为每种身份验证类型提供了 8 个潜在的“标志”,其中IsOpenID的最后一位采用倒数第二位OAuth;还有 2 个标志的空间以供将来扩展,由0x4和给出0x80进一步扩展将需要对非标志值进行额外的尾随。

IsOpenID检查OpenID flagis10; 同样IsOAuth检查OAuth标志。

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

于 2012-11-29T08:44:31.383 回答