避免出现歧义方法异常,但即使添加了参数列表,GetMethod也返回null



以前有人问过这个问题,但我无法解决我的问题。

我从以下代码中得到null:

typeof(SettingsController)
.GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>), typeof(HttpStatusCode) });

我需要传递参数列表,因为我在SettingsController:的base类中有两个同名的方法

public T GetById<T>(Guid? id, IValidator<T> validator, HttpStatusCode statusCode = HttpStatusCode.OK)
public T GetById<T>(Guid? id, string route, IValidator<T> validator, HttpStatusCode statusCode = HttpStatusCode.OK)

我错过了什么?

当存在具有不同约束的多个重载时,为单个方法获取特定MethodInfo的最简单方法是创建具有匹配签名的新委托;

var method = new Func<Guid?, IValidator<object>, HttpStatusCode,object>(((SettingsController)null).GetById).Method;

当有许多类似的方法时,这一点尤其有用。例如,dotnet框架使用这种技术来区分IQueryable的许多类似过载。

以下是我的发现,希望它能帮助您进一步挖掘:

var unspecificMethodType = typeof(Program).GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>), typeof(HttpStatusCode) });
unspecificMethodType.Dump(); // null
var method = typeof(Program).GetMethods()
.Where(m => m.Name == "GetById")
.First();
var methodGenericType = method.GetGenericArguments()[0];
methodGenericType.Dump(); // T
var specificMethodType = typeof(Program).GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>).MakeGenericType(methodGenericType), typeof(HttpStatusCode) });
specificMethodType.Dump(); // GetById (Guid? id, IValidator<T> validator, HttpStatusCode statusCode

从我所看到的情况来看,这个测试可以突出问题:

var paramType = method.GetParameters()[1].ParameterType;
paramType.Dump(); // Program+IValidator`1[T]
(paramType == typeof(IValidator<>)).Dump(); // false

相关内容

  • 没有找到相关文章

最新更新