以前有人问过这个问题,但我无法解决我的问题。
我从以下代码中得到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