Вызов общего метода с использованием отражения в .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 все еще содержит общие параметры.