Создайте делегат из methodinfo (2)
Моя ситуация заключается в том, что я хочу иметь делегат метода из элемента управления.
Для этого я использую следующий код :
Private RepeatDelayCounter As Integer = 0 Private RepeatControl As Control = Nothing Private Delegate Sub delegate_OnClick(instance As Control, e As System.EventArgs) Private RepeatDelegate As delegate_OnClick = Nothing Private Sub Button_Down(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) RepeatControl = sender RepeatDelegate = Nothing Dim myType As Type = RepeatControl.GetType Dim myInfo As System.Reflection.MethodInfo = myType.GetMethod("OnClick", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) If myInfo IsNot Nothing Then RepeatDelegate = [Delegate].CreateDelegate(GetType(delegate_OnClick), myInfo, False) RepeatDelayCounter = 0 End Sub
Вы должны знать, что это только часть (но соответствующая) сложного класса.
Этот код работает правильно (я получаю делегат), если элемент управления, запускающий Button_Down-метод, использует переопределенную версию OnClick-метода.
Если я использую не индивидуальный элемент управления, а "стандартный" элемент управления (например, кнопку) Я получаю правильный MethodInfo, потому что этот элемент управления имеет OnClick-метод внутри, но я не могу получить делегат.
Сообщение об ошибке, которое я получаю, указывает на флаги привязки, но они полностью совпадают с теми, что были получены из моего пользовательского элемента управления. Поэтому я думаю, что это происходит от защищенного атрибута метода OnClick из "стандартного"элемента управления.
Так... что мне нужно, так это полезный совет, как решить эту проблему-потому что я хочу ее понять ... ;-)
Что я уже пробовал:
см. выше ...
Tomas Takac
Вы создаете делегат для метода экземпляра, но не предоставляете instace. Найдено здесь: http://stackoverflow.com/questions/11120401/creating-delegate-from-methodinfo
Richard Deeming
Это откройте экземпляр делегата[^]- экземпляр передается в качестве первого параметра.