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

