16

flags enum 変数に値を追加するためにこれを行う代わりに:

MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;

これを可能にする拡張メソッドを作成したいと思います。

MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);

可能?どのようにしますか?

4

3 に答える 3

24

有用な方法ではありません。列挙型は値型であるため、拡張メソッドを作成すると、列挙型のコピーが渡されます。これは、それを利用するにはそれを返す必要があることを意味します

    public static class FlagExtensions
    {
        public static MyFlags Add(this MyFlags me, MyFlags toAdd)
        {
             return me | toAdd;
        }
    }

    flags = flags.Add(MyFlags.Coke); // not gaining much here

もう 1 つの問題は、意味のある方法でこれをジェネリックにできないことです。列挙型ごとに 1 つの拡張メソッドを作成する必要があります。

編集:

列挙型の役割を逆にすることで、適切な近似を引き出すことができます。

public static class FlagsExtensions
{
    public static void AddTo(this MyFlags add, ref MyFlags addTo)
    {
         addTo = addTo | add;
    }
}


MyFlags.Coke.AddTo(ref flags);
于 2011-04-26T16:43:20.210 に答える
12

Enum拡張メソッドにも取り組んでいます。

s のadd / remove ジェネリック メソッドを作成しようとしEnumましたが、冗長であることがわかりました。

追加するには、次のようにします。

MyFlags flags = MyFlags.Pepsi;
flags |= MyFlags.Coke;

削除するには、次のことができます。

MyFlags flags = MyFlags.Pepsi | MyFlags.Coke;
flags &= ~MyFlags.Coke;

XOR (^)を使用しないでください。存在しない場合はフラグが追加されます。

flags ^= MyFlags.Coke; // Do not use!!!

それが役に立ったことを願っています。その他の拡張メソッドは、次のサイトで確認できます:私のブログ

于 2012-10-17T08:16:57.113 に答える
2

解決策ではありませんが、冗長性を減らして読みやすさを向上させることが目的の場合は、拡張メソッドを使用した流暢なインターフェイスが少なくとも部分的に役立ちます。

[Flags]
public enum MyFlags
{
    None = 0,
    A    = 0x1,
    B    = 0x2,
}

public static class MyFlagsExt
{
    public static MyFlags A(this MyFlags myFlags)
    {
        return myFlags | MyFlags.A;
    }

    public static MyFlags B(this MyFlags myFlags)
    {
        return myFlags | MyFlags.B;
    }
}

...

var flags = MyFlags.A.B();
于 2014-05-18T12:47:14.877 に答える