0

私のプロジェクトでは、ユーザーのアクセス権を定義する bool の配列を使用しています。例えば

public bool[] Security {get; set;}

どこ

[0] = Admin
[1] = GrantWrites
[2] = GrantDeletes
[3] = User

それはかなりうまくいっています。{F,T,F,T} または {0,1,0,1} に設定すると、その特定のユーザーがユーザーとしてアクセスできるようになり、書き込みが可能になります。

それを列挙型に変換しようとしていますが、明らかにその配列が必要です。

現在、私は次のものを持っています(動作していません)

public class UserCrops
{
    public UserCrops(etc.., Enum[] _Security)
    {
    .
    .
    .
        Security = _Security;
    }
    .
    .
    .
    public Enum[] Security
    {
        Admin,
        GrantWrites,
        GrantDeletes,
        User
    }

}

このようなリンクがいくつか見つかりましたが、助けにはなりません。

前もって感謝します

編集:両方の答えは非常によく説明されていますが、私にとっては簡単に思えるという理由だけで、非フラグのものを使用します:)

Edit2:新しいオブジェクトを作成するにはどうすればよいですか(クラスの外ですか?)

bool[] security = new bool[9];
for (int i = 0; i < 9; i++)
    {
    security[i] = chklstSecurity.Items[i].Selected;
}
userCropList.Add(new UserCrops(.., txtBiologicalAssessmentApprovalDate.Text, security));

でも今?

4

2 に答える 2

7

試してみてください:

[Flags]
public enum Security
{
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}

そして、次のように使用します。

Security security = Security.GrantWrites | Security.GrantDeletes;

if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}

pswgで指摘されているように、読みやすさを向上させるために比較を単純化できます。enumさらに、 (変数が初期化されていない場合) にデフォルト値を含めることをお勧めします。

[Flags]
public enum Security
{
    None = 0,
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}

最後に、フラグの一般的な組み合わせのショートカットを提供できることに注意してください。

[Flags]
public enum Security
{
    // Other values
    FullAccess = Admin | GrantWrites | GrantDeletes
}

詳細については、MSDNを参照してください。このアプローチは、ファイル システム (およびその他の多く) のファイル/ディレクトリの属性を模倣することに注意してください。IMOは、他の回答で提案されているように、列挙型の配列を保持するよりもはるかに簡単に使用できます:

  • アクセス許可が付与されているかどうかを確認するために配列全体を検索する必要はありません。
  • 値をチェックする必要はありませんnull(enumできませんnull、配列はできます)。
  • 使用するスペースが少なくなります (最近ではそれほど重要ではありませんが)。
  • 当然(より)安全であるため、必要なチェックは少なくなります(たとえば、配列内の重複を避けるため)。
  • 簡単に保存できます(追加コードなしのテキストまたは整数として)。

しかし、それと比較して、2 つの主な欠点があります。

  • フラグは有限です ( を使用している場合は 32 個、 を使用している場合はInt3264enumInt64)。
  • 他のものに簡単に切り替えることはできません (たとえば、Securityクラスになる必要がある場合は、列挙型の構文を模倣するためにさらに多くのコードを記述する必要があり、列挙型を操作するときにコードによって行われたいくつかの仮定が壊れます)。
于 2013-11-06T07:13:55.890 に答える
6

を削除して代わりに[]使用:enumEnum

public enum Security
{
    Admin,
    GrantWrites,
    GrantDeletes,
    User
}

Security[]そして、おそらくメソッドパラメーターとして使用したいと思うでしょう:

public UserCrops(etc.., Security[] _Security) 

フラグを使用することも (アドリアーノが示唆するように) 優れた提案ですが、アクセス許可の保存方法を再考する必要があります。の配列を格納する代わりに、boolセキュリティ セット全体を単一の値として表し、異なるビットが各権限を表します。

詳細については、列挙型 (C# プログラミング ガイド)の「ビット フラグとしての列挙型」セクションを参照してください。

于 2013-11-06T07:13:32.963 に答える