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

.NET 4.8下如何用反射调用类中所有方法并获取返回值

.NET 4.8 反射调用静态方法验证配置项的解决方案

你需要解决的是通过反射调用ConfigValues类的所有静态配置方法,以此验证配置项是否存在的问题。核心问题在于静态方法的反射调用方式,以及需要过滤掉不需要的方法(比如工具方法、继承的Object方法)。

问题代码回顾

原检查方法:

public static void CheckConfigValues()
{
    var cv = new ConfigValues();
    var cvt = cv.GetType();
    var cvm = cvt.GetMethods();

    foreach (var item in cvm)
    {
        var itemValue = ?????
        if(string.IsNullOrEmpty(itemValue))
        {
            throw ...
        }
    }
}       

原ConfigValues类(补全后):

public class ConfigValues
{
    public static int GetMaxCalendarItems()
    {
          return int.Parse(ReadKeyFromAppConfig("GetMaxCalendarItems"));
    }
    
    public static int GetSomething()
    {
          return int.Parse(ReadKeyFromAppConfig("Something"));
    }
    
    public static string ReadKeyFromAppConfig(string keyName)
    {
        try
        {
            var keyValue = ConfigurationManager.AppSettings[keyName];
            if (!string.IsNullOrEmpty(keyValue))
            {
                return keyValue;
            }
            else
            {
                Logger.Error($"Unable to read variable {keyName}");
                throw new MissingFieldException(keyName);
            }   
        }
        catch (Exception ex)
        {
            Logger.Error($"Error reading config key {keyName}: {ex.Message}", ex);
            throw;
        }
    }
}

修正后的实现方案

public static void CheckConfigValues()
{
    var configType = typeof(ConfigValues);
    // 筛选出需要调用的配置方法:公共静态、当前类声明、无参数、非泛型,排除工具方法
    var configMethods = configType.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly)
                                 .Where(m => !m.IsGenericMethod 
                                             && m.GetParameters().Length == 0 
                                             && m.Name != nameof(ConfigValues.ReadKeyFromAppConfig));

    foreach (var method in configMethods)
    {
        try
        {
            // 静态方法调用时实例参数传null
            var result = method.Invoke(null, null);
            
            // 针对字符串类型返回值做额外空值检查
            if (result is string strValue && string.IsNullOrEmpty(strValue))
            {
                throw new InvalidOperationException($"配置项[{method.Name}]的值为空");
            }
        }
        catch (TargetInvocationException ex)
        {
            // 抛出方法内部的原始异常,去掉反射的包装
            throw ex.InnerException ?? ex;
        }
    }
}

关键细节说明

  1. 静态方法的反射调用:静态方法不需要实例对象,调用Invoke时第一个参数传null即可。
  2. 方法过滤:通过BindingFlags和LINQ筛选,只保留我们定义的配置获取方法,排除掉ReadKeyFromAppConfig工具方法以及继承自Object的通用方法(比如ToString、Equals)。
  3. 异常处理:反射调用方法时,方法内部抛出的异常会被包装为TargetInvocationException,需要取出InnerException才能得到原始的配置缺失异常。
  4. 返回值检查:因为ReadKeyFromAppConfig已经在配置缺失/为空时抛出异常,所以大部分情况下只要方法能执行完成就说明配置有效;针对字符串类型的返回值,可以额外做一次空值校验作为双重保险。

内容的提问来源于stack exchange,提问作者Aj.son

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:20:26