原理
利用反射获取当前程序集下的所有类型使用LINQ 查询实现接口的类,并将结果转换为列表
1. 关键代码
// 获取当前正在执行的程序集
var implementingClasses = Assembly.GetExecutingAssembly().GetTypes()
// 选择实现了 IManager 接口的类型
.Where(t => t.GetInterfaces().Contains(typeof(IManager)))
// 将符合条件的类型转换为列表
.ToList();
2. 示例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
public class Manager :MonoBehaviour
{
private List<Type> m_ImplementingClasses;
public void Start()
{
// 获取当前正在执行的程序集
m_ImplementingClasses = Assembly.GetExecutingAssembly().GetTypes()
// 选择实现了 IManager 接口的类型
.Where(t => t.GetInterfaces().Contains(typeof(IManager)))
// 将符合条件的类型转换为列表
.ToList();
foreach (var implementingClass in m_ImplementingClasses.Where(implementingClass => implementingClass.Name == nameof(TestManager)))
{
implementingClass.GetMethod("Init")?.Invoke(null, new object[]{"测试"});
}
}
}
public class TestManager : IManager
{
public static void Init(string message)
{
Debug.Log($"I am SAA {message}");
}
}
public interface IManager
{
}