いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-009 (System.Type)(02)(FindXXX系メソッド)

System.Typeの2回目です。


TypeクラスにあるFindXXX系メソッドについてのサンプルです。
これらのメソッドは、引数に検索の際にフィルタリングするためのフィルターデリゲート
を指定します。


あまり、使うことはないかもしれませんが・・・・。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;

using Gsf.Research.ClassLibrary;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// サンプル動作確認用のインターフェースです。
    /// </summary>
    internal interface ISampleInterface1{
    }

    /// <summary>
    /// サンプル動作確認用のインターフェースです。
    /// </summary>
    internal interface ISampleInterface2 : ISampleInterface1{
    }

    /// <summary>
    /// サンプル動作確認用のインターフェースです。
    /// </summary>
    internal interface ISampleInterface3 : ISampleInterface2{
    }

    /// <summary>
    /// サンプル動作確認用のデータクラスです。
    /// </summary>
    internal class SampleData{
        string _id;
        string _name;

        public SampleData(string id, string name){
            _id   = id;
            _name = name;
        }

        public string Id{
            get{
                return _id;
            }
            set{
                _id = value;
            }
        }

        public string Name{
            get{
                return _name;
            }
            set{
                _name = value;
            }
        }
    }

    /// <summary>
    /// System.Typeクラスのサンプルです。
    /// </summary>
    /// <remarks>
    /// System.Typeクラスのメソッドに関するサンプルです。
    /// フィールドのサンプルに関しては、TypeResearch00を参照願います。
    /// </remarks>
    public class TypeResearch01 : IExecutable, ISampleInterface3{

        public void Execute(){
            Type myType = GetType();
            Console.WriteLine(myType.FullName);

            //
            // FindInterfacesメソッド.
            //
            // 指定したフィルター条件に当てはまるインターフェースを
            // 抽出します。
            //
            // 以下では、抽出条件としてISampleInterface1のサブクラスを指定しています。
            //
            foreach(Type t in myType.FindInterfaces(new TypeFilter(MyTypeFilter), typeof(ISampleInterface1))){
                Console.WriteLine("見つかったインターフェース={0}", t.Name);
            }

            //
            // FindMembersメソッド
            //
            // 指定したフィルター条件に当てはまるメンバー情報を
            // 抽出します。
            //
            // 以下では、抽出条件として指定した文字列に一致するプロパティ名を持つ
            // publicなプロパティ情報を取得しています。
            //
            //
            SampleData   sample = new SampleData("id001", "gsf_zero1");
            BindingFlags flags  = (BindingFlags.Public | BindingFlags.Instance);

            foreach(MemberInfo m in sample.GetType().FindMembers(MemberTypes.Property, flags, new MemberFilter(MyMemberFilter), "Na")){
                Console.WriteLine("見つかったプロパティ={0}", m.Name);
            }
        }

        /// <summary>
        /// FindInterfacesメソッドにて使用するTypeFilterデリゲートの実装です。
        /// </summary>
        private bool MyTypeFilter(Type t, object o){
            if(o == null || (o as Type) == null){
                return false;
            }

            Type criteria = o as Type;

            if(criteria.IsAssignableFrom(t)){
                return true;
            }

            return false;
        }

        /// <summary>
        /// FindMembersメソッドにて使用するMemberFilterデリゲートの実装です。
        /// </summary>
        private bool MyMemberFilter(MemberInfo info, object o){
            if(o == null || (o as string) == null){
                return false;
            }

            string criteria = o as string;

            if(info.Name.IndexOf(criteria) != -1){
                return true;
            }

            return false;
        }
    }
}

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。