[C#]拡張メソッドが定義されているスタティッククラスとスタティック変数を使って、拡張プロパティ?っぽいことをやってみる。

staticな関数が複数あって、その中で使用されるある型のリストから、ある要素だけ除外したいなぁって考えた時、拡張メソッドが定義されているstatic classとその中のstatic変数を使って除外することができました。

stringの配列から”BLACK”のみ除外する例

stringの拡張メソッド用staticクラス

    public static class Extensions
    {
        /// <summary>
        /// 除外リスト
        /// </summary>
        private static List<string> _list = new List<string>();

        /// <summary>
        /// 除外リストに追加する
        /// </summary>
        /// <param name="str"></param>
        public static void AddList(this string str)
        {
            _list.Add(str);
        }

        /// <summary>
        /// 除外リストを取得する
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static List<string> GetList(this string str)
        {
            return _list;
        }
    }

使用例

    class Program
    {
        static void Print(List<string> strs)
        {
       /// 除外リストに登録されていない文字列のみ表示する
            foreach (var p in strs.Where(p => !p.GetList().Contains(p)))
            {
                Console.WriteLine(p);
            }
        }

        static void Main(string[] args)
        {
            var str1 = "RED";
            var str2 = "BLACK";
            var str3 = "BLUE";
            var str4 = "WHITE";

            var list = (new[] { str1, str2, str3, str4 }).ToList();

            Console.WriteLine("Print 1");
            Print(list);

            /// "BLACK"を除外したい
            str2.AddList();

            Console.WriteLine("\nPrint 2");
            Print(list);

            Console.ReadKey();
        }
    }

実行結果

Print 1
RED
BLACK
BLUE
WHITE

Print 2
RED
BLUE
WHITE

Print関数はstaticな関数ですが、class Program内で例えば除外リスト用のstatic変数を用意していません。stringクラスの拡張メソッド(AddList)を使用することにより拡張メソッドが定義されているクラス内のstatic変数に値が保持されますので、拡張メソッドが有効なスコープ内であればその値を参照できることになります。
Print関数自体が拡張メソッドでもいいし、ここでは文字列ですが自分の好きな条件で除外リストを作成してみても面白いです。
今までは除外リスト用の変数を例えば引数に追加するなどしていたのでちょっと便利ですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.