【问题标题】:C# how to know the method Name that the event as attachedC#如何知道附加事件的方法名称
【发布时间】:2011-06-15 20:33:23
【问题描述】:

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

我有活动的eventInfo

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

而且我知道附加事件的元素。

FrameworkElement elemento = target.TargetObject as FrameworkElement;

获得方法名后,我就可以使用这个委托了。

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

我有一个标记扩展类:

[MarkupExtensionReturnType(typeof(FrameworkElement))] [内容属性(“内容”)] 公共类 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 中调用的方法的名称。但我无法通过代码获取它。

有什么办法吗?

【问题讨论】:

    标签: c# events methods


    【解决方案1】:

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

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

    【讨论】:

    • 我试着去做,但我做不到。你能给我寄一份样品吗?
    • @Pescarolo,你能说得更具体点吗?你想做什么?
    • 我尝试在我的委托中使用 methodInfo 但它不起作用。
    • @Pescarolo,我建议编辑您的问题并发布一个示例,说明您如何获取 MethodInfo(来自自动事件私有字段?),然后您如何处理它。需要注意的一个陷阱是 EventInfo 定义了一个 GetRaiseMethod(),但这不是底层委托使用的方法。事实上,在 C# 或 VB 中,这将始终返回 null(它们的编译器没有为事件定义 Raise 方法。)
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2011-03-08
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多