#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. Стандартная документация значительно облегчает поиск причины ошибки :)
Комментариев нет:
Отправить комментарий