flags enum 変数に値を追加するためにこれを行う代わりに:
MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;
これを可能にする拡張メソッドを作成したいと思います。
MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
可能?どのようにしますか?
flags enum 変数に値を追加するためにこれを行う代わりに:
MyFlags flags = MyFlags.Pepsi;
flags = flags | MyFlags.Coke;
これを可能にする拡張メソッドを作成したいと思います。
MyFlags flags = MyFlags.Pepsi;
flags.Add(MyFlags.Coke);
可能?どのようにしますか?
有用な方法ではありません。列挙型は値型であるため、拡張メソッドを作成すると、列挙型のコピーが渡されます。これは、それを利用するにはそれを返す必要があることを意味します
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);
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!!!
それが役に立ったことを願っています。その他の拡張メソッドは、次のサイトで確認できます:私のブログ
解決策ではありませんが、冗長性を減らして読みやすさを向上させることが目的の場合は、拡張メソッドを使用した流暢なインターフェイスが少なくとも部分的に役立ちます。
[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();