Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Рефлексия. Как вызвать метод с ref generic параметрами?

Имеем такой класс и метод
public class TestClass { public void Swap(ref T first, ref T second) { T tmp = second; second = first; first = tmp; } }
Пытаюсь задействовать рефлексию и вызвать метод
[TestMethod] public void InvokeGenericMethod() { MethodInfo method = typeof(TestClass).GetMethod("Swap"); MethodInfo methodWithInt = method.MakeGenericMethod(typeof(int));
int one = 1; int two = 2; object[] arguments = { one, two }; methodWithInt.Invoke(this, arguments);//здесь ошибка
Assert.AreEqual(one, 2); }
и получаю ошибку {"Объект не соответствует конечному типу."}
Как это делается? Гуглеж приводил к примерам с одним параметром out и чего-то все вызывалось как обычно, т.е. массив аргументов создавался как у меня, а далее обычный вызов через Invoke(). Какие идеи?


Ответ

Вы вызываете нестатический метод, и должны передать в качестве первого аргумента Invoke объект, у которого вы этот метод хотите вызвать. И это должен быть объект того класса, метод которого вы вызываете:
methodWithInt.Invoke(new TestClass(), arguments);
Или вы можете поменять метод на статический, и передавать null в качестве первого аргумента:
public class TestClass { public static void Swap(ref T first, ref T second) { T tmp = second; second = first; first = tmp; } }

methodWithInt.Invoke(null, arguments);
Кстати, в MSDN по Invoke подробно расписано, в каких случаях он бросает TargetException. Стандартная документация значительно облегчает поиск причины ошибки :)

Комментариев нет:

Отправить комментарий