You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:28:31