Вызов общего метода с использованием отражения в .NET.
У меня есть вопрос. Можно ли вызвать общий метод, используя отражение в .NET?
Я попробовал следующий код
var service = new ServiceClass();
Type serviceType = service.GetType();
MethodInfo method = serviceType.GetMethod("Method1", new Type[]{});
method.MakeGenericMethod(typeof(SomeClass));
var result = method.Invoke(service, null);
Но это порождает следующее исключение: "Операции с поздней строкой не могут выполняться для типов или методов, для которых ContainsGenericParameters истинно".
Ответы
Ответ 1
Вы не используете результат MakeGenericMethod
- который не меняет метод, по которому вы его вызываете; он возвращает другой объект, представляющий построенный метод. У вас должно быть что-то вроде:
method = method.MakeGenericMethod(typeof(SomeClass));
var result = method.Invoke(service, null);
(или, конечно, используйте другую переменную).
Ответ 2
Вам нужно сказать
method = method.MakeGenericMethod(typeof(SomeClass));
в мин. и предпочтительно
var constructedMethod = method.MakeGenericMethod(typeof(SomeClass));
constructedMethod.Invoke(service, null);
поскольку экземпляры MethodInfo
являются неизменяемыми.
Это та же концепция, что и
string s = "Foo ";
s.Trim();
Console.WriteLine(s.Length);
string t = s.Trim();
Console.WriteLine(t.Length);
вызывая
4
3
для печати на консоли.
Кстати, ваше сообщение об ошибке
"Операции с ограниченной границей не могут выполняться для типов или методов, для которых ContainsGenericParameters
является true
."
если ваш ключ, что method
все еще содержит общие параметры.