#c_sharp #generics #рефлексия #ref
Имеем такой класс и метод 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(). Какие идеи?
Ответы
Ответ 1
Вы вызываете нестатический метод, и должны передать в качестве первого аргумента 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. Стандартная документация значительно облегчает поиск причины ошибки :)
Комментариев нет:
Отправить комментарий