#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>();