このコードは BindingFlags
フラグに対応していないので
internal
クラスの場合インスタンスが生成できなくなるので注意
internal クラスの場合はインスタンス作成時に引数がかなければ
Activator.CreateInstance(t, true)
で作成できる
using System; using System.Linq; public static T[] CreateInstances<T>(params object[] args) where T : class { var type = typeof(T); return type.Assembly.GetTypes() .Where(t => !t.IsAbstract && t.IsSubclassOf(type)) .Select(t => Activator.CreateInstance(t, args) as T) .ToArray(); }
使い方
public class Base {} public class Child1 : Base {} public class Child2 : Base {} void Main() { // これで Child1 と Child2 のインスタンスが作成される var instances = CreateInstances<Base>(); }