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; } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場