如何批量调用Namespace.Objects下所有类的RunThis静态方法?
嘿,这个需求完全可以用.NET的反射机制搞定!我给你梳理下具体怎么实现,包括检查类是否有目标方法、批量调用以及收集返回值的完整流程:
核心思路
我们要利用反射遍历Namespace.Objects命名空间下的所有类,先检查两个关键点:一是类名是否符合你的过滤规则(如果有的话),二是类中是否存在无参数的静态RunThis方法。确认符合条件后,再调用方法并收集返回值。
具体实现步骤
- 第一步:获取当前程序集中属于
Namespace.Objects命名空间的所有类 - 第二步:遍历每个类,先根据类名做过滤(可选),再检查是否存在符合要求的静态
RunThis方法 - 第三步:调用符合条件的方法,将返回值统一收集起来
完整代码示例
下面是Namespace.MainClass中的实现代码,包含类名过滤和方法检查的逻辑:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Namespace { public class MainClass { public static void Main() { // 存储所有符合条件的方法返回值 var methodResults = new List<object>(); // 获取当前程序集(如果类在其他程序集,改用Assembly.LoadFrom或Assembly.Load) var targetAssembly = Assembly.GetExecutingAssembly(); // 筛选出Namespace.Objects命名空间下的所有非抽象类 var objectNamespaceClasses = targetAssembly.GetTypes() .Where(type => type.Namespace == "Namespace.Objects" && type.IsClass && !type.IsAbstract); // 排除抽象类,让逻辑更严谨 foreach (var classType in objectNamespaceClasses) { // -------------------------- // 这里是类名检查逻辑(示例):跳过名称包含"Skip"的类 // 你可以根据自己的需求修改这个判断条件 // -------------------------- if (classType.Name.Contains("Skip")) { Console.WriteLine($"跳过类:{classType.Name}(类名符合跳过规则)"); continue; } // -------------------------- // 检查是否存在无参数的公共静态RunThis方法 // 如果方法有参数,需要修改Type.EmptyTypes为对应的参数类型数组,比如new Type[] { typeof(string) } // 如果要支持私有静态方法,添加BindingFlags.NonPublic到BindingFlags中 // -------------------------- var runThisMethod = classType.GetMethod( "RunThis", BindingFlags.Public | BindingFlags.Static, Type.EmptyTypes); if (runThisMethod != null) { Console.WriteLine($"正在调用:{classType.Name}.RunThis()"); // 静态方法调用时第一个参数为null(不需要实例) var result = runThisMethod.Invoke(null, null); methodResults.Add(result); } else { Console.WriteLine($"跳过类:{classType.Name}(未找到符合要求的RunThis静态方法)"); } } // 处理收集到的返回值 Console.WriteLine("\n===== 所有方法返回值汇总 ====="); foreach (var result in methodResults) { Console.WriteLine(result != null ? result.ToString() : "方法无返回值"); } } } }
关键注意事项
- 方法参数适配:如果
RunThis方法有参数,需要把Type.EmptyTypes替换成对应的参数类型数组,比如方法接受一个字符串参数,就改成new Type[] { typeof(string) },调用Invoke时第二个参数传入对应的参数值数组 - 私有方法支持:如果需要调用私有静态
RunThis方法,把BindingFlags.Public换成BindingFlags.NonPublic,或者同时保留BindingFlags.Public | BindingFlags.NonPublic - 跨程序集处理:如果
Namespace.Objects下的类不在当前执行的程序集里,需要用Assembly.LoadFrom("你的程序集路径.dll")或者Assembly.Load("程序集名称")来获取目标程序集 - 返回值类型转换:如果所有
RunThis方法都返回相同类型(比如int),可以把List<object>改成List<int>,调用后强转成对应类型:var result = (int)runThisMethod.Invoke(null, null);
内容的提问来源于stack exchange,提问作者user5426405
相关产品推荐
相关产品推荐

