リフレクションにおける Type.GetConstructors メソッドを使用すると、そのクラスがどのような初期化パターン(コンストラクタのオーバーロード)を持っているかを動的にリストアップできます。
これは、DI(依存性注入)コンテナが最適なコンストラクタを自動選択する際や、クラスの仕様を解析してドキュメントを生成するツールなどで利用される技術です。
ここでは、標準の System.Exception クラスを例に、定義されているコンストラクタの一覧と、それぞれの引数の型情報を解析して表示する実装方法を解説します。
コンストラクタ一覧の取得と解析
以下のサンプルコードでは、BindingFlags を指定してパブリックなインスタンスコンストラクタを取得し、LINQを使用して引数の型名をカンマ区切りで整形して出力します。
サンプルコード
using System;
using System.Linq;
using System.Reflection;
public class Program
{
public static void Main()
{
// 1. 解析対象の型情報を取得(ここでは System.Exception を例にします)
Type targetType = typeof(Exception);
Console.WriteLine($"クラス: {targetType.Name} のコンストラクタ一覧\n");
// 2. コンストラクタ情報の配列を取得
// Instance: インスタンス生成用
// Public: 公開されているもの
var constructors = targetType.GetConstructors(BindingFlags.Instance | BindingFlags.Public);
foreach (var ctor in constructors)
{
// 3. 各コンストラクタの引数パラメータ情報を取得
ParameterInfo[] parameters = ctor.GetParameters();
// 引数の型名を配列化し、カンマ区切りの文字列に変換
// 例: "String, Exception"
string argString = string.Join(", ",
parameters.Select(p => p.ParameterType.Name));
// 出力形式: クラス名(引数型1, 引数型2...)
// コンストラクタ名(Nameプロパティ)は通常 ".ctor" となりますが、
// ここでは読みやすくクラス名を表示します。
Console.WriteLine($"{targetType.Name}({argString})");
}
}
}
実行結果(例)
クラス: Exception のコンストラクタ一覧
Exception()
Exception(String)
Exception(String, Exception)
Exception(SerializationInfo, StreamingContext)
解説と技術的なポイント
1. GetConstructorsメソッド
Type クラスの GetConstructors メソッドは、その型に定義されているコンストラクタのメタデータ(ConstructorInfo)を配列で返します。 メソッドと同様に、デフォルトでは public なインスタンスコンストラクタのみが返されます。private なコンストラクタ(例えばシングルトンパターンのクラスなど)を取得したい場合は、BindingFlags.NonPublic を併用する必要があります。
2. パラメータ情報の解析
取得した ConstructorInfo オブジェクトに対し GetParameters() を呼び出すことで、引数のリスト(ParameterInfo[])を取得できます。 各 ParameterInfo からは以下の情報が得られます。
ParameterType: 引数の型(例:System.String)Name: 引数の変数名(例:message)IsOptional: 省略可能な引数かどうかDefaultValue: デフォルト値
3. コンストラクタの名前
リフレクション内部では、コンストラクタの名前は常に .ctor(インスタンスコンストラクタ)または .cctor(静的コンストラクタ)として扱われます。ログ出力などを行う際は、サンプルコードのように DeclaringType.Name(定義しているクラス名)で代用すると、C#のコードに近い表記になります。
