C#中GetMethod返回null问题排查求助及解决代码分享
排查反射GetMethod返回null的问题&修复方案
嘿,我仔细看了你的代码和描述,发现了几个关键问题,咱们一步步来解决:
1. 最显眼的错误:多调用了一次GetType()
你这段代码里有个低级失误:
MethodInfo method1 = model.GetType().GetMethod(MappingColums.Tokens.Get + modelName);
注意哦,model本身已经是ProductValidation的Type对象了!model.GetType()拿到的是System.Type这个类的类型,根本不是你要找的目标类的Type,这完全找错了对象!应该直接用model.GetMethod(...),去掉多余的.GetType()。
2. 实例方法不能用Type对象调用
你的GetProduct()是实例方法(不是static),但你最后写的method.Invoke(model, null)是把model(Type类型)传进去当实例用,这肯定不行!必须先创建ProductValidation的实例,再调用方法。
3. 为什么GetMethods()也没找到方法?(额外排查点)
你说调试时能看到Declared Methods里有这个方法,但FirstOrDefault没命中,可能的原因:
- 名称不匹配:仔细核对
MappingColums.Tokens.Get + modelName的输出是不是完全等于"GetProduct"(大小写、有没有多空格/少字符都要注意) - BindingFlags缺失:虽然
GetMethods()默认返回公共实例方法,但显式指定BindingFlags能避免意外:model.GetMethods(BindingFlags.Public | BindingFlags.Instance) .FirstOrDefault(x => x.Name == "GetProduct" && x.GetParameters().Length == 0); - Type对象不对:确认
model.FullName是不是你要的ProductValidation的完整命名空间+类名,别拿到了同名的其他类。
修正后的完整代码示例
结合ASP.NET Core的场景,给你写个正确的版本:
// 先确保拿到正确的ProductValidation类型 Type model = AssemblyHelper.GetTypeByClassName(Assembly.GetExecutingAssembly(), modelName + MappingColums.Tokens.Validation); // 获取目标方法 MethodInfo method = model.GetMethod("GetProduct", BindingFlags.Public | BindingFlags.Instance); // 或者用过滤的方式: // MethodInfo method = model.GetMethods(BindingFlags.Public | BindingFlags.Instance) // .FirstOrDefault(x => x.Name == MappingColums.Tokens.Get + modelName && x.GetParameters().Length == 0); // 创建ProductValidation实例:因为构造函数需要IProductRepository,从DI容器获取 // 如果你在Controller里,可以通过构造函数注入IServiceProvider,或者直接注入IProductRepository var productRepo = _serviceProvider.GetRequiredService<IProductRepository>(); object validationInstance = Activator.CreateInstance(model, productRepo); // 调用实例方法 object result = method.Invoke(validationInstance, null);
为啥你提供的可行代码能跑?
因为那段代码里:
- 没有犯
GetType()的错误,直接用目标Type调用GetMethods() - 先通过构造函数创建了类的实例,再用实例调用方法
- 方法名称的拼接是正确的
总结一下,你最初的问题核心就是两个:错误地对Type对象调用了GetType(),以及试图用Type对象调用实例方法。修正这两点,再确保方法名称完全匹配,问题就解决啦!
内容的提问来源于stack exchange,提问作者szkut
相关产品推荐
相关产品推荐

