枚举和两个"Sub-Enumerations"



这是一个架构师的问题!

有两个条件独立的枚举

enum OpenID
{
Google,
Aol
}
enum OAuth
{
Facebook,
Twitter
}
class Provider 
{ 
public OpenID openid;
public OAuth oauth;
}

对我来说,将提供程序的所有成员分成OpenID和OAuth是非常合乎逻辑的。

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

将有一个需要排序的提供程序实例数组。

有什么办法吗

  • 支持此部门(OpenID vs OAuth)和

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

这意味着,如果一个值被添加到任何枚举中,比如 OAuth: 枚举 OAuth { 脸书, 唽 Instagram }

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

我牢记的想法:

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

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

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

你有什么惊天霆万钧的想法吗?甚至可能带有代码示例!

我想你可以做如下的事情:

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 个标志用于未来的扩展,由0x40x8给出。进一步扩展将需要对非标志值进行额外的尾随0

IsOpenID检查OpenID flag1还是0;类似地,IsOAuth检查OAuth标志。

由于标志使用枚举的位,因此对这些值的任何排序都将反映"提供程序 ID"部分,而不是标志。

最新更新