Страницы

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

среда, 1 января 2020 г.

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

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

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

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