1

私は.NETで書かれたレガシーWebアプリケーションに取り組んでいます。アプリケーションの開始時に、ログインしているユーザータイプを確認し、ユーザータイプに基づいて表示するUI要素を決定します。

これを実装する方法は、各ユーザータイプのケースを処理する一連のifステートメントと、それに続くユーザータイプに基づいてさまざまなUI要素を表示または非表示に設定する関数呼び出しです。問題は、関数呼び出しがやや面倒だということです。次の約500行があります。

setTabsVisible(true, true, true, true, true, true, true, true, true, true, false, false);
if (!locked)
{
    setActionButtonsVisibile(true, false, true, "Submit", "");
    script += setTabsReadOnly(false, false, false, false, false, false, true, false, false, false, true, true);
    script += setSubTabsReadOnly(true, true, false, true, true, true, false, false, true, true, false, true);
}
script += setSubTabsVisible(false, false, false, false, false, false, true, false, false, true, true);

true、true、false、trueなどは、一見しただけではあまり読みやすくありません。オンまたはオフになっているものを確認するには、関数にカーソルを合わせ、ブール値をパラメーターリストに一致させる必要があります。

したがって、より良い解決策は、ビット単位のORで結合された定数から構築されたビットフィールドである可能性があると考えていました。このように、関数呼び出しは次のようになります。

setTabsReadOnly(notesTab | documentsTab | signoffTab | etc);

ただし、C#はビットフィールドをサポートしていないようです。より良い解決策はありますか?それとも変更する価値がありますか?

4

4 に答える 4

6
[Flags]
public enum MyFlags : short
{
    Foo = 0x1,
    Bar = 0x2,
    Baz = 0x4
}

public static class Program
{
    public static void Main()
    {
        CheckFlags(MyFlags.Bar | MyFlags.Baz);
    }

    public static void CheckFlags(MyFlags flags)
    {
        if (flags.HasFlag(MyFlags.Foo))
            Console.WriteLine("Item has Foo flag set");

        if (flags.HasFlag(MyFlags.Bar))
            Console.WriteLine("Item has Bar flag set");

        if (flags.HasFlag(MyFlags.Baz))
            Console.WriteLine("Item has Baz flag set");
    }
}

上記の例が示すように、FlagEnumsを使用してコードを簡略化する必要があります。列挙型の詳細については、このリファレンスを確認してください。したがって、あなたの場合、次のようになります。

public static void setTabsReadOnly(YourEnum flags)
{
    // Your Code
} 

setTabsReadOnly(YourEnum.NotesTab | YourEnum.DocumentsTab | YourEnum.SignoffTab);
于 2013-01-16T17:58:28.303 に答える
4

を作成する必要があるようですFlags Enum。メソッドを変更して、列挙型のパラメーターのみを使用してから、適用する列挙型を使用してメソッドを呼び出すことができます。

public void MyMethod(MyEnumeration myEnum) { ... }
...
MyMethod(MyEnumeration.First | MyEnumeration.Second | MyEnumeration.Third);

MSDNからのサンプル:

列挙型を使用してビットフラグを定義できます。これにより、列挙型のインスタンスは、列挙型リストで定義された値の任意の組み合わせを格納できます。

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

http://msdn.microsoft.com/en-us/library/cc138362.aspx

于 2013-01-16T17:58:39.683 に答える
3

ただし、C#はビットフィールドをサポートしていないようです。より良い解決策はありますか?

Flags列挙は基本的にビットフィールドです。

列挙型をビットフィールドとして扱うことができることを示します。つまり、フラグのセットです。

[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};

// Black and Red:
MultiHue mh = MultiHue.Black & MultiHue.Red;
于 2013-01-16T17:58:28.740 に答える
2

必要なのは、Flags属性を持つ列挙型を使用することです。

[Flags]
enum TabOptions
{
    notesTab = 0x01,
    documentsTab = 0x02,
    signoffTab = 0x04
}

次に、記述した方法で値をOR列挙できます。

void setTabsReadOnly(TabOptions options)
{
   //do stuff
} 

setTabsReadOnly(notesTab | documentTab | signoffTab)

于 2013-01-16T18:00:23.370 に答える