0

それは建築家の質問です!

条件付き独立の列挙が2つあります

enum OpenID
{
  Google,
  Aol
}

enum OAuth
{
  Facebook,
  Twitter
}

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

プロバイダーセットのすべてのメンバーをOpenIDとOAuthに分離することは私にとって非常に論理的です。

If(openid == null)// 1つの動作、If(oauth == null)//別の動作。

ソートする必要のあるプロバイダーインスタンスの配列があります。

方法はありますか

  • この部門(openidとoauth)をサポートし、

  • 3D列挙を実装せずに、すべてのXメンバーを任意に配置する機能を追加します(例:{Facebook、Google、Aol、Twitter})。

つまり、いずれかの列挙型に値が追加されている場合は、OAuthと言います。enumOAuth {Facebook、Twitter、Instagram}

並べ替えのサポートを実際に追加するために、コード内の別の場所にこの値(Instagram)を明示的に記述する必要はありません。

私が心に留めているアイデア:

  • とにかく単一の列挙型がありますが、プレフィックスを追加します。つまり、列挙型X {OpenID_Google、OpenID_Aol、OAuth_Facebook、OAuth_Twitter}です。

ダウンサイズ-列挙型A(またはB)固有のアクションで操作する方法はありません。これで、タイプを示すbool変数ができました。boolIsOpenId; bool 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

IsOpenIDこれは、列挙型の最後の 8 ビットが、認証タイプごとに 8 つの潜在的な「フラグ」を与えることを意味しますOAuth。と で指定された、将来の拡張用にさらに 2 つのフラグ用のスペースが0x4あり0x8ます。さらに拡張するには、0フラグ以外の値に追加の末尾が必要になります。

IsOpenIDかどうかOpenID flagをチェックします。同様にフラグをチェックします。10IsOAuthOAuth

フラグは列挙の下位ビットを使用するため、これらの値の並べ替えは、フラグではなく「プロバイダー ID」の部分を反映します。

于 2012-11-29T08:44:31.383 に答える