カスタム属性の逆引きが欲しい その2
昨日のエントリより
このような処理は数個〜10個程度のプロパティしか持たない自作のクラスの場合は全く問題無いが、.NET Frameworkで提供されているクラスを派生したクラスに対してプロパティ情報のパースを行うと、祖先までクラス階層を手繰ると数百のプロパティをパースすることになってしまう。
無いものねだりをしても仕方が無いので現状でできることをしよう。ディクショナリに格納してハッシュ検索にするか、はたまた配列のサーチを使うかとも思ったが、せっかくなのでC# 2.0で導入されたGenericsのArrays.FindAll
//カスタム属性BindingAttributeが設定されているプロパティ情報だけを取得 PropertyInfo[] props = Array.FindAll(type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy), delegate(PropertyInfo info) { return Attribute.IsDefined(info, typeof(BindingAttribute));}); //取得した配列をパースしながら、該当のカスタム属性をリストに追加 IList attrs = new List (); Array.ForEach (props, delegate(PropertyInfo info) { attrs.Add( Attribute.GetCustomAttribute(info, typeof(BindingAttribute)) as BindingAttribute ); });
匿名デリゲートを使用しているのは、ラムダ式っぽく書きたいためなのだがやはりデリゲートはデリゲートだな。
平気で使っている人もいるが、私の言語認識能力の物差しで見ると、この書き方の可読性は最悪の部類だと思う。(昔あった、BASIC 1LINEでどんだけのプログラムが書けるか、ってのを思い出した)
C# 3.0ではラムダ式(VBだけじゃないよね?)やLINQが使えるようになるので、もっとすっきり書けるのだろうな。