Вызов метода в базовом поле класса с отражением

#c# #reflection #field #instance #base-class

#c# #отражение #поле #экземпляр #базовый класс

Вопрос:

Я совершенно новичок в отражении, и у меня возникли некоторые проблемы со следующей проблемой. Учитывая следующую структуру класса, я хотел бы вызвать AddAdornments() .

 internal interface IVsCodeWindowManager
{
    int AddAdornments();
}    

internal class CompoundTextViewWindow
{
    private IVsCodeWindowManager _codeWindowManager;
}

internal class VsCodeWindowAdapter : CompoundTextViewWindow
{
}
 

У меня есть экземпляр VsCodeWindowAdapter:

 VsCodeWindowAdapter projCodeWindow;
 

Я бы хотел вызвать AddAdornments . Например, если бы все было общедоступным, вызов был бы :

 projCodeWindow._codeWindowManager.AddAdornments();
 

Я могу получить доступ к _codeWindowManager FieldInfo с отражением:

 var _codeWindowManagerFieldInfo = projCodeWindow.GetType().BaseType.GetField("_codeWindowManager", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 

Следующий код возвращает null, я считаю, что мне нужен экземпляр базового класса, чтобы получить доступ к _codeWindowManager полю.

 var _codeWindowManager = _codeWindowManagerFieldInfo.GetValue(projCodeWindow);
 

Как я могу использовать отражение, чтобы получить доступ к экземпляру базового класса, чтобы я мог вызвать AddAdornments() метод?

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

1. Вам нужно выполнить GetMethod() , чтобы получить a MethodInfo из ненулевого экземпляра codeWindowManager , как только у вас есть этот MethodInfo, вы можете его вызвать.

Ответ №1:

Таким образом, вы можете вызвать определенный метод из класса, используя отражение (имейте в виду, что метод не должен быть связан со значениями, которые необходимо инициализировать в конструкторе класса, поскольку этот подход не создает экземпляр класса):

 var InvokeMethod = typeof(YourClass).GetMethod("MethodName");
// or Get.Methods() 

InvokeMethod.Invoke(Arguements);
// if you use Get.Methods() you will get a collection of methods, enumerate in the collection to find what you want.
 

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

1. Может YourClass быть внутренним типом из чужой сборки? Или это YourClass экземпляр этого типа?

2. @JoshVarty: если он включен в программу, почему бы и нет! Но я не думаю, что это может быть экземпляром чего-либо.

3. @JoshVarty: затем вы должны использовать Activator для создания экземпляра этого класса, например : dynamic x = Activator.CreateInstance<SomeType>();