0

小さな問題があります。これは私の問題の簡略版です。

ボタンの名前 (New、Edit、Delete) のリストと「Type」タイプのオブジェクトを持つクラスがあります。

class test
{
    private List<Button> buttons; // 
    private Type type;

    public test(Type t)
    {
            this.type = t;
            /* some code to create the buttons from the enum. 
            got this already covered but "Restore" does not get created by intention*/
    }

    public void setButtons(int i)
    {

    }
}

型は flags 属性を持つ列挙型です

[Flags] enum EnumTest{None=0, New=1, Edit=2, Delete=4, Restore=8}

私がしたいのは、「setButtons」メソッドで「type」のインスタンスを作成し、「int i」からフラグ値に値を設定し、ボタンのリストを調べて、「Enabled」プロパティを設定することですフラグが立てられているかどうかに応じたボタン。ボタンの「名前」プロパティは、列挙型 (EnumTest またはその他) のフラグ名に依存します。

私はいくつかのものを試しました

    var enu = Enum.ToObject(type, i);

しかし、フラグを設定できないか、方法がわかりません。作成中にリフレクションを使用することを考えていました。「ToObject」メソッドは flags 属性ではうまく機能しないようです。「TryParse」はそうですが、「Type」から動的にロードする方法がわかりません。

これは私の問題の非常に単純化されたバージョンですが、意味を維持する場所であることを考慮してください。

4

1 に答える 1

1

を呼び出すときEnum.ToObject(...)System.Typeパラメーターは、列挙値を取得しようとしている列挙の型であると想定されます。

したがって、次のように呼び出す必要があります。

EnumTest myTestVar = (EnumTest)Enum.ToObject(typeof(EnumTest), i); // i is the integer to be converted to one of the enumeration values.

注: これはi、 が で定義されている値のいずれかである場合にのみ機能しEnumTestます。i = 6たとえば、 6 は列挙メンバーの 1 つではなく、そのメンバーの 2 つの組み合わせであるため、上記は機能しないと思います。

HTH。

アップデート:

さて、ここで私が見るものは2つあります。ジェネリックを使用して問題を回避できるのではないかと思いEnumましたが、ジェネリック型パラメーターの型制約として使用することは許可されていません。(これは、私が C# 列挙よりも Java 列挙の方が好きなところです。実際には、Java 列挙で独自のカスタム メソッドを定義できます。C# にはさいころはありません)。

私が目にするもう1つの問題は、メソッドの提案された使用Enum.ToObject(Type t, int i)法にあります。メソッドの概要には、「指定された 32 ビット符号付き整数を列挙型メンバーに変換する」[強調鉱山] と明確に記載されます6したがって、必要なビット フィールドが設定された列挙型オブジェクトを渡して期待することはできないと思います。MSDNのドキュメントはこれを裏付けているようです。Enum.IsDefinedメソッドのドキュメントも参照してください。最後に、あなたにもSystem.Enum役立つHasFlagメソッドがあります。これがあなたの問題の根源かもしれないと思います。ToObject「複合」列挙値で使用しようとしたことはありません。

有効に設定するボタンのリストを渡すだけではどうですか。

class test
{
    private List<Button> buttons;

    public test() { /* Whatever constructor logic you need. */ }

    public void setButtons(List<Button> btnsToEnable)
    {
        btnsToEnable.ForEach(btn => btn.Enabled = true);

        // Or perhaps:
        buttons.Intersect(btnsToEnable).ToList().ForEach(btn => btn.Enabled = true);
   }
}

LINQ を使用して目的を達成する方法は複数あります。それは本当にオブジェクトモデルに依存します。これらの考えが、シナリオに適した別の道を歩み始めるきっかけになることを願っています。

于 2013-05-29T17:34:16.640 に答える