В одной из предыдущих статей мы уже рассматривали доступ к закрытым полям и свойствам. В этой статье мы рассмотрим, как вызвать закрытый метод.
Также как и в предыдущем случае вызвать закрытый метод можно двумя способами. Из вложенного класса и с использованием рефлексии.
Использование вложенных классов
Закрытый метод можно вызвать во вложенном классе. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class TestClass { private int TestInt(int a) { return a; } class TestInnerClass { public void TestMethod() { TestClass tc = new(); int a = tc.TestInt(5); } public void TestMethod2(TestClass tc) { int a = tc.TestInt(5); } } } |
Использование рефлексии
Для доступа к закрытым методам используется класс MethodInfo. Рассмотрим вызов при помощи рефлексии закрытого метода из примера выше.
1 2 3 4 5 |
TestClass tc = new(); // Получение доступа к методу по его имени. MethodInfo methodInfo = typeof(TestClass).GetMethod("TestInt", BindingFlags.NonPublic | BindingFlags.Instance); // Вызов метода с передачей параметра. int a = (int)methodInfo.Invoke(tc, new object[] { 5 }); |
Обратите внимание на флаги BindingFlags.NonPublic (член класса private, internal или protected) и BindingFlags.Instance (член класса не является статическим). Эти флаги необходимо обязательно передавать в метод GetField и притом совместно. Иначе доступ к полю не будет установлен.
Также следует обратить внимание на то, что параметры передаются в вызываемый метод в виде массива типа object, который передаётся вторым параметром в метод Invoke класса MehodInfo. Если вызываемый метод не принимает параметров, то второй параметр метода Invoke можно опустить, так как он сам по себе не является обязательным.
Добавить комментарий