C# サンプル集 |
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 >
クラスのメンバー一覧を取得する
2020/10/25
目次
メソッドの名前の一覧を取得
次の例は String クラスの public なメソッドの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメソッドも取得できます。 MethodInfo[] methods = typeof(string).GetMethods(flag); //←ここで対象を string と指定 //MethodInfo[] methods = 変数.GetType().GetMethods(flag); //←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。 foreach (MethodInfo method in methods) { if (method.IsSpecialName) { //プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。 continue; } System.Diagnostics.Debug.WriteLine(method.Name); } |
- コメントの行を有効にするとprivate, protectedなど非publicなメソッドも取得できます。ただし、基底クラスのprivateなメソッドは取得できません。
- オーバーロードされて同じ名前のメソッドが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
メソッドの名前と引数と戻り値の一覧を取得
次の例は int (Int32構造体)の public なメソッドの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメソッドも取得できます。 MethodInfo[] methods = typeof(int).GetMethods(flag); //←ここで対象を int と指定 //MethodInfo[] methods = 変数.GetType().GetMethods(flag); //←このようにすると、変数から呼び出せるメソッドの一覧を取得できます。 foreach (MethodInfo method in methods) { if (method.IsSpecialName) { //プロパティ・イベント・演算子のために自動生成されたメソッドは対象外にします。 continue; } //▼戻り値を出力 System.Diagnostics.Debug.Write(method.ReturnType.Name + " "); //▼メソッド名を出力 System.Diagnostics.Debug.Write(method.Name); //▼パラメーターリストを出力 var paramDescriptions = new List<string>(); foreach (ParameterInfo param in method.GetParameters()) { paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); } System.Diagnostics.Debug.Write("("); System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray())); System.Diagnostics.Debug.Write(")"); System.Diagnostics.Debug.WriteLine(""); } |
実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。
出力例抜粋
Int32 CompareTo(Object value)
Int32 CompareTo(Int32
value)
Boolean Equals(Object obj)
Boolean Equals(Int32
obj)
Int32 GetHashCode()
String ToString()
- コメントの行を有効にするとprivate, protectedなど非publicなメソッドも取得できます。ただし、基底クラスのprivateなメソッドは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
プロパティの名前の一覧を取得
次の例は DateTime 構造体の public なプロパティの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のプロパティも取得できます。 PropertyInfo[] props = typeof(DateTime).GetProperties(flag); //←ここで対象を DateTime と指定 //PropertyInfo[] props = 変数.GetType().GetProperties(flag); //←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。 foreach (PropertyInfo prop in props) { System.Diagnostics.Debug.WriteLine(prop.Name); } |
- コメントの行を有効にするとprivate, protectedなど非publicなメソッドも取得できます。ただし、基底クラスのprivateなメソッドは取得できません。
- オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
プロパティの名前と型の一覧を取得
次の例は DateTime 構造体の public なプロパティの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のプロパティも取得できます。 PropertyInfo[] props = typeof(DateTime).GetProperties(flag); //←ここで対象を DateTime と指定 //PropertyInfo[] props = 変数.GetType().GetProperties(flag); //←このようにすると、変数から呼び出せるプロパティの一覧を取得できます。 foreach (PropertyInfo prop in props) { //▼型を出力 System.Diagnostics.Debug.Write(prop.PropertyType.Name); System.Diagnostics.Debug.Write(" "); //▼プロパティ名を出力 System.Diagnostics.Debug.Write(prop.Name); System.Diagnostics.Debug.WriteLine(""); } |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなプロパティも取得できます。ただし、基底クラスのPrivateなプロパティは取得できません。
- 型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。
- オーバーロードされて同じ名前のプロパティが複数存在する場合、複数出力されます。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
フィールドの一覧を取得
次の例は Math クラスの public なフィールドの一覧を表示します。フィールドとはクラスレベルの変数と定数のことです。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のフィールドも取得できます。 FieldInfo[] fields = typeof(Math).GetFields(flag); //←ここで対象を Math と指定 //FieldInfo[] fields = 変数.GetType().GetFields(flag); //←このようにすると、変数から呼び出せるフィールドの一覧を取得できます。 foreach (FieldInfo field in fields) { //▼型を出力 System.Diagnostics.Debug.Write(field.FieldType.Name); System.Diagnostics.Debug.Write(" "); //▼フィールド名を出力 System.Diagnostics.Debug.Write(field.Name); System.Diagnostics.Debug.WriteLine(""); } |
- コメントの行を有効にするとPrivate, Protectedなど非Publicなフィールドも取得できます。ただし、基底クラスのPrivateなフィールドは取得できません。
- 型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
イベントの一覧を取得
次の例は Form クラス(System.Windows.Forms.Form)の public なイベントの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のイベントも取得できます。 EventInfo[] events = typeof(System.Windows.Forms.Form).GetEvents(flag); //←ここで対象を Form と指定 //EventInfo[] events = 変数.GetType().GetEvents(flag); //←このようにすると、変数から呼び出せるイベントの一覧を取得できます。 foreach (EventInfo ev in events) { //▼イベントハンドラー System.Diagnostics.Debug.Write(ev.EventHandlerType.Name + " "); //▼イベント名を出力 System.Diagnostics.Debug.Write(ev.Name); //▼パラメーターリストを出力 var paramDescriptions = new List<string>(); foreach (var param in ev.EventHandlerType.GetMethod("Invoke").GetParameters()) { paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); } System.Diagnostics.Debug.Write("("); System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray())); System.Diagnostics.Debug.Write(")"); System.Diagnostics.Debug.WriteLine(""); } |
実行すると次のように出力されます。型の表現は フレームワークの表現になるため、たとえば、intはInt32となり、boolは Boolean で表されるなどC#の表現とは異なります。
EventHandler AutoSizeChanged(Object sender, EventArgs e)
EventHandler AutoValidateChanged(Object sender, EventArgs e)
CancelEventHandler HelpButtonClicked(Object sender,
CancelEventArgs e)
EventHandler
MaximizedBoundsChanged(Object sender, EventArgs e)
EventHandler MaximumSizeChanged(Object sender, EventArgs e)
EventHandler MarginChanged(Object sender, EventArgs e)
- コメントの行を有効にするとprivate, protectedなど非publicなイベントも取得できます。ただし、基底クラスのprivateなイベントは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
コンストラクターの一覧を取得
次の例は FileInfo クラスの public なコンストラクターの一覧を表示します。
共有メンバー(静的メンバー)・基底クラスのメンバーも含みます。
ファイルの上の方に using System.Reflection; が記述されていることが前提です。
BindingFlags flag
= BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.Static
| BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のコンストラクターも取得できます。 ConstructorInfo[] ctors = typeof(System.IO.FileInfo).GetConstructors(flag); //←ここで対象を FileInfo と指定 //ConstructorInfo[] ctors = 変数.GetType().GetConstructors(flag); //←このようにすると、変数のクラス・構造体の持つコンストラクター一覧を取得できます。 foreach (ConstructorInfo ctor in ctors) { //▼クラス名を出力。(C#ではコンストラクターの宣言は必ず クラス名 であるため模倣します) System.Diagnostics.Debug.Write(ctor.DeclaringType.Name); //▼パラメーターリストを出力 var paramDescriptions = new List<string>(); foreach (ParameterInfo param in ctor.GetParameters()) { paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); } System.Diagnostics.Debug.Write("("); System.Diagnostics.Debug.Write(string.Join(", ", paramDescriptions.ToArray())); System.Diagnostics.Debug.Write(")"); System.Diagnostics.Debug.WriteLine(""); } |
- コメントの行を有効にするとprivate, protectedなど非publicなイベントも取得できます。ただし、基底クラスのprivateなイベントは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
メンバーの一覧を取得
次の例で示す GetClassMembersメソッドを使用するとクラス・構造体のメンバーの一覧をVisual Basicのプログラムに似た形式で出力できます。使用例は下にあります。
ファイルの上の方に Imports System.Reflection が記述されていることが前提です。
public string
GetClassMembers<T>(T
o) { return GetClassMembers<T>(); } public string GetClassMembers<T>() { BindingFlags flag = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy; //flag |= BindingFlags.NonPublic; //←この行を有効にすると、非public(private, protectedなど)のメンバーも取得できます。 MemberInfo[] members = typeof(T).GetMembers(flag); StringBuilder sb = new StringBuilder(); foreach (MemberInfo member in members) { if (member.MemberType == MemberTypes.Constructor) { //コンストラクターの場合 ConstructorInfo ctor = member as ConstructorInfo; //▼アクセススコープ(public, private等) sb.Append(GetAccessScope(ctor)); //▼static if (ctor.IsStatic) { sb.Append("static "); } //▼クラス名 sb.Append(member.DeclaringType.Name); //▼パラメーターリスト var paramDescriptions = new List<string>(); foreach (ParameterInfo param in ctor.GetParameters()) { paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); } sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")"); } else if (member.MemberType == MemberTypes.Event) { //イベントの場合 EventInfo ev = member as EventInfo; //▼アクセススコープ(public, private等) MethodInfo method = ev.AddMethod; sb.Append(GetAccessScope(method)); //▼static if (method.IsStatic) { sb.Append("static "); } //▼宣言 sb.Append("event "); //▼イベントハンドラー sb.Append(ev.EventHandlerType.Name + " "); //▼イベント名を出力 sb.Append(ev.Name); //▼このコメントを解除するとイベントのパラメーターリストを出力できます。 //var paramDescriptions = new List<string>(); //foreach (var param in ev.EventHandlerType.GetMethod("Invoke").GetParameters()) //{ // paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); //} //sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")"); } else if (member.MemberType == MemberTypes.Field) { //フィールドの場合 FieldInfo field = member as FieldInfo; //▼アクセススコープ(public, private等) sb.Append(GetAccessScope(field)); //▼static と const if (field.IsStatic) { if (field.IsLiteral) { sb.Append("const "); } else { sb.Append("static "); } } //▼型 sb.Append(field.FieldType.Name + " "); //▼フィールド名を出力 sb.Append(field.Name); //▼定数の場合、その値 if (field.IsLiteral) { sb.Append(" = " + field.GetRawConstantValue().ToString()); } } else if (member.MemberType == MemberTypes.Method) { //メソッドの場合 MethodInfo method = member as MethodInfo; if (method.IsSpecialName) { continue; } //▼アクセススコープ(public, private等) sb.Append(GetAccessScope(method)); //▼static if (method.IsStatic) { sb.Append("static "); } //▼戻り値を出力 sb.Append(method.ReturnType.Name + " "); //▼メソッド名を出力 sb.Append(method.Name); //▼パラメーターリストを出力 var paramDescriptions = new List<string>(); foreach (ParameterInfo param in method.GetParameters()) { paramDescriptions.Add(param.ParameterType.Name + " " + param.Name); } sb.Append("(" + string.Join(", ", paramDescriptions.ToArray()) + ")"); } else if (member.MemberType == MemberTypes.Property) { //プロパティの場合 PropertyInfo prop = member as PropertyInfo; //▼アクセススコープ(public, private等) //この例ではgetでスコープを判断します。getが存在しない場合やgetとsetでアクセススコープが違う場合がありえますが、このサンプルでは想定しません。 MethodInfo method = prop.GetMethod; sb.Append(GetAccessScope(method)); //▼static if (method.IsStatic) { sb.Append("static "); } //▼型 sb.Append(prop.PropertyType.Name + " "); //▼プロパティ名を出力 sb.Append(prop.Name); //▼getterとsetterの有無 sb.Append("{ "); if (prop.GetMethod != null) { sb.Append("get; "); } if (prop.SetMethod != null) { sb.Append("set; "); } sb.Append("}"); } sb.AppendLine(); } return sb.ToString(); } public string GetAccessScope(MemberInfo member) { if ((bool)(member.GetType().GetProperty("IsPublic").GetValue(member))) { return "public "; } if ((bool)(member.GetType().GetProperty("IsAssembly").GetValue(member))) { return "internal "; } if ((bool)(member.GetType().GetProperty("IsFamily").GetValue(member))) { return "protected "; } if ((bool)(member.GetType().GetProperty("IsFamilyOrAssembly").GetValue(member))) { return "protected internal "; } if ((bool)(member.GetType().GetProperty("IsFamilyAndAssembly").GetValue(member))) { return "private protected "; } if ((bool)(member.GetType().GetProperty("IsPrivate").GetValue(member))) { return "private "; } throw new ArgumentException(); } |
- コメントの行を有効にするとprivate, protectedなど非Publicなコンストラクターも取得できます。ただし、基底クラスのprivateなコンストラクターは取得できません。
- flag の組み合わせを調整することで取得対象を変更できます。→ BindingFlagsの効果
- この例この例はC#のプログラムになぞらえて出力していますが、ref や インデクサーなど対応していないキーワード・構文も多々あります。プログラム内のコメントを参照してください。
出力例(抜粋)
public Void ResetText()
public Control
GetNextControl(Control ctl, Boolean forward)
public
Button()
public Color BackColor{ get; set; }
public
static Point MousePosition{ get; }
public event
EventHandler Click
public event MouseEventHandler
MouseWheel
使用例使用例1:Buttonクラスのメンバー一覧を出力
string
definition = GetClassMembers<Button>(); System.Diagnostics.Debug.WriteLine(definition); |
使用例2:DateTime構造体のメンバー一覧を出力
string
definition = GetClassMembers<DateTime>(); System.Diagnostics.Debug.WriteLine(definition); |
使用例3:DateTime型の変数からそのメンバー一覧を出力
DateTime d =
new
DateTime(2024, 6, 27); string definition = GetClassMembers(d); System.Diagnostics.Debug.WriteLine(definition); |