C # как узнать имя метода, к которому прикреплено событие - PullRequest
1 голос
/ 16 июня 2011

Я хотел бы знать, как найти имя метода, к которому прикреплено мое событие.

У меня есть eventInfo события

EventInfo eventInfo = elemento.GetType().GetEvent("Click");

, и я знаю элементчто событие как прикрепленное.

FrameworkElement elemento = target.TargetObject as FrameworkElement;

После того, как я получу имя метода, я смогу использовать этот делегат.

Delegate methodDelegate = Delegate.CreateDelegate(eventInfo.EventHandlerType, parentClass, "? ? ? ?");

У меня есть класс markupextension:

[MarkupExtensionReturnType (typeof (FrameworkElement))]] [ContentProperty ("content")] открытый класс InsereSom: MarkupExtension {

    public InsereSom()
    { }

    [ConstructorArgument("Ligado")]
    public bool Ligado
    {
        get;
        set;
    }

    [ConstructorArgument("Evento")]
    public RoutedEvent Evento
    {
        get;
        set;
    }


    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        IProvideValueTarget target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
        FrameworkElement elemento = target.TargetObject as FrameworkElement;
        RoutedEventHandler metodo = new RoutedEventHandler(EventoInsereSom);



        elemento.AddHandler(Evento, metodo);

        EventInfo eventInfo = elemento.GetType().GetEvent("Click");

        FrameworkElement parentClass = (MainWindow)((Grid)elemento.Parent).Parent;

        Delegate methodDelegate = Delegate.CreateDelegate(eventInfo.EventHandlerType, parentClass, "Button_Click");

        eventInfo.RemoveEventHandler(elemento, methodDelegate);
        eventInfo.AddEventHandler(elemento, methodDelegate);


        return new System.Windows.Controls.Label();
    }


    public void EventoInsereSom(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Hello Extension Markup");
    }

}

и этот код Xaml

Я хотел бы сначала поместить мое событие в класс разметки.Перед событием в коде позади.Для этого мне нужно имя метода, который мой компонент вызывает при вызове xaml.Но я не могу получить это по коду.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 16 июня 2011

Событие - это пара методов доступа (очень похоже на Property), поэтому технически у вас даже нет доступа к делегату, не говоря уже о имени метода.Если это автоматическая оболочка (наиболее типичная), вы можете предположить в имени поля делегата (вы можете запустить ildasm, чтобы посмотреть, что он генерирует по умолчанию), но это не гарантированно сработает, если авторкласс написал свои собственные обработчики добавления и удаления.Например, делегат может храниться в каком-то словаре, а не в поле.

Если вы действительно получаете доступ к базовому полю делегата, вы можете перечислить делегата (он может иметь несколько подписчиков) и можетиспользуйте свойство Method для получения MethodInfo, с которым связано Name , хотя теперь вы можете напрямую использовать MethodInfo для создания своего собственного делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...