C#如何知道方法名称即附加事件

时间:2011-06-15 20:33:24

标签: c# events methods

我想知道如何找到附加我的事件的方法的名称。

我有事件的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( “内容”)]     公共类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 个答案:

答案 0 :(得分:1)

Event是一对访问器(很像属性),所以从技术上讲,你甚至无法访问该委托,更不用说方法名了。如果它是一个自动包装器(最典型的),你可以在委托字段名称​​ guess (你可以运行ildasm来查看它默认生成的内容),但如果作者不能保证这不起作用该类编写了自己的添加和删除处理程序。例如,委托可能存储在某种字典中,而不是存储在字段中。

如果您确实可以访问底层委托字段,则可以枚举委托(它可以有多个订阅者)并可以使用Method属性来获取MethodInfo,它具有关联的Name ,但现在您可以直接使用MethodInfo创建自己的委托。

相关问题