原理
利用反射获取当前程序集下的所有类型使用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
{
}
3. 运行结果

本文介绍了如何利用C#的反射和LINQ查询在运行时获取当前程序集下实现IManager接口的所有类,并演示了如何遍历这些类并调用它们的方法。
2102

被折叠的 条评论
为什么被折叠?



