В одной из предыдущих статей мы уже рассматривали доступ к закрытым полям и свойствам. В этой статье мы рассмотрим, как вызвать закрытый метод.
Также как и в предыдущем случае вызвать закрытый метод можно двумя способами. Из вложенного класса и с использованием рефлексии.
Использование вложенных классов
Закрытый метод можно вызвать во вложенном классе. Пример:
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. Рассмотрим вызов при помощи рефлексии закрытого метода из примера выше.
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 можно опустить, так как он сам по себе не является обязательным.