コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】アセンブリ内から指定されたインターフェイスが実装されているすべての型情報を取得する

using System;
using System.Linq;
using System.Reflection;

/// <summary>
/// Assembly クラスに関する汎用関数を管理するクラス
/// </summary>
public static class AssemblyUtils
{
    /// <summary>
    /// 現在実行中のコードを格納しているアセンブリ内の指定されたインターフェイスが実装されているすべての Type を返します
    /// </summary>
    public static Type[] GetInterfaces<T>()
    {
        return Assembly.GetExecutingAssembly().GetTypes().Where(c => c.GetInterfaces().Any(t => t == typeof(T))).ToArray();
    }
    
    /// <summary>
    /// 現在実行中のコードを格納しているアセンブリ内の指定されたインターフェイスが実装されているすべての Type のインスタンスを作成して返します
    /// </summary>
    public static T[] CreateInterfaceInstances<T>() where T : class
    {
        return GetInterfaces<T>().Select(c => Activator.CreateInstance(c) as T).ToArray();
    }
}