Отражение: как получить общий метод?
Возможные дубликаты:
Как использовать отражение для вызова общего метода?
Выбрать правильный общий метод с отражением
Привет, там
Скажем, у меня есть два следующих двух метода в классе:
public void MyMethod(object val) {}
public void MyMethod<T>(T val) {}
С отражением я мог бы получить первый метод следующим образом:
Type[] typeArray = new Type[1];
typeArray.SetValue(typeof(object), 1);
var myMethod = myInstance.GetType().GetMethod("MyMethod", typeArray);
Но как я могу получить второй, общий метод?
Ответы
Ответ 1
var myMethod = myInstance.GetType()
.GetMethods()
.Where(m => m.Name == "MyMethod")
.Select(m => new {
Method = m,
Params = m.GetParameters(),
Args = m.GetGenericArguments()
})
.Where(x => x.Params.Length == 1
&& x.Args.Length == 1
&& x.Params[0].ParameterType == x.Args[0])
.Select(x => x.Method)
.First();
Ответ 2
Я бы сделал это следующим образом:
var methods = from m in typeof(MyClass).GetMethods()
where m.Name == "MyMethod"
&& m.IsGenericMethodDefinition
let typeParams = m.GetGenericArguments()
let normalParams = m.GetParameters()
where typeParams.Length == 1 && normalParams.Length == 1
&& typeParams.Single() == normalParams.Single().ParameterType
&& !typeParams.Single().GetGenericParameterConstraints().Any()
select m;
var myMethod = methods.Single();
Мы ищем метод под названием "MyMethod", который является общим методом с единственным параметром типа без ограничений и одним "нормальным" параметром того же типа, что и параметр типа.
Очевидно, что если вы не хотите быть очень точным, вы можете просто сделать минимальный минимум для устранения неоднозначности, например:
var myMethod = typeof(MyClass)
.GetMethods()
.Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition);