这是一个建筑师的问题!
有两个有条件独立的枚举
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)来实际添加对排序的支持。
我牢记的想法:
缩小尺寸 - 无法使用枚举A(或B)特定操作进行操作。 现在我有一个bool变量来表示类型:bool IsOpenId; bool IsOAuth;
你有任何雷击的想法吗?甚至可能使用代码示例!
答案 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
取倒数第二位;由0x4
和0x8
给出的空间可以为将来的扩展添加2个标记。进一步扩展需要对非标记值进行额外的尾随0
。
IsOpenID
检查OpenID flag
是1
还是0
;同样IsOAuth
检查OAuth
标志。
因为标志使用枚举的 low 位,所以对这些值的任何排序都将反映“提供者ID”部分而不是标志。