【问题标题】:C# Trigger a method after another method (defined in a third party dll) is completedC#在另一个方法(在第三方dll中定义)完成后触发一个方法
【发布时间】:2011-10-11 09:53:53
【问题描述】:

这可能属于方法扩展、覆盖或多态的类别(我是 C# 和 OO 的新手,所以请原谅我,我还在学习 :-))。

我有一个使用 3rd 方 API 的应用。在 API 中,有一种对自定义控件进行右键单击+选择操作的方法(该控件是一个图像查看器,用户可以在其中右键单击并循环到父组中存在的另一个图像)。

在我有限的理解中,我认为需要发生这两件事中的一件(是否可以完成或者其中任何一个是否是一个好的解决方案都悬而未决!)

  1. 我不想覆盖现有方法,我只想以某种方式附加到它。
  2. 如果有一种方法可以检测到特定事件何时触发并完成,请调用我的方法。如果可用,请设置某种侦听器。

谢谢!!

【问题讨论】:

  • 如果事件或虚拟方法没有公开曝光,这将是困难的。你能在你的问题中包含这个对象的接口吗?
  • 似乎没有,正如我在下面所说的,我什至无法将自己的点击事件放在控件上。

标签: c# events methods append


【解决方案1】:

由于您没有发布任何参考,我将尝试概述一些方法。

  1. 如果有事件

    CustomControl cc = yourCustomControl;
    cc.SelectionCompleted += (sender, args) => { YourMethod() };
    

    这是一个使用 lambda 的匿名事件处理程序。

    另一种方法是:

    public class Form1 : Form
    {
       public Form1()
       {
          this.cc.SelectionCompleted += HandlerSelectionCompleted;
       }
       public void HandlerSelectionCompleted(object sender, EventArgs e)
       {
          YourCustomMethod();
       }
    }
    
  2. 有一种方法可以覆盖

    public class YourCustomControl : CustomControl
    {
       public override void Selection()
       {
          base.Selection(); // first call the original method
    
          // now do some custom stuff
       }
    }
    

【讨论】:

  • 好吧,结果我什至无法访问正在触发的第 3 方方法。 api没有给我事件。事实上,我什至无法将自己的标准 mouseclick 事件添加到自定义控件中,所以在这一点上,我似乎很困难。
【解决方案2】:

你不能重写那个方法:没错,如果它不是受保护的/虚拟的/抽象的,或者你不能从那个组件的类派生。 您可以在组件中搜索事件并猜测(如果没有任何文档)在您想要的操作之后触发哪个事件。并实际执行该事件句柄中的代码。

可能还有其他“黑客”技巧,但我个人会避免做类似的事情,如果不是出于个人热情,而是专注于设计我的程序,以满足需求并支持该组件,尽可能我能。

问候。

【讨论】:

    【解决方案3】:

    您所描述的是面向方面编程 AOP 的租户。如果您想检测第 3 方 .NET dll,我会推荐 PostSharp http://www.sharpcrafters.com/solutions/logging

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-11
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      相关资源
      最近更新 更多