c# - 如何处理对通用类型事件的订阅?

标签 c# generics events

我正在开发 WinForms 应用程序。在许多情况下,我需要在较小的查看区域中显示一个新的屏幕,因此我使用了面板。基本上,我从面板继承,从面板中公开我需要的信息的任何属性,在面板中显示信息所需的任何事情都发生在它自己的代码后面。这些面板将始终完全停靠在一个父控件(主窗体)上。

我创建了一个通用方法来显示这些面板:

private static T ShowPanel<T>(Control parent, params object[] parameters) where T: Panel
{
    T panelToShow = (T)Activator.CreateInstance(typeof(T), parameters);

    parent.Controls.Add(panelToShow);

    panelToShow.Dock = DockStyle.Fill;
    panelToShow.BringToFront();
    panelToShow.Show();

    return panelToShow;
}

我是这样使用它的,但我知道必须有更好的方法来处理事件订阅。

private void ShellButton_Click(object sender, EventArgs e)
{
    if (CurrentSelectedSite == null)
    {
        AlertSelectSite();
        return;
    }

    SystemViewPanel panel = ShowPanel<SystemViewPanel>(this, CurrentSelectedSite.Systems);

    panel.SystemsListbox.DoubleClick += new EventHandler(ShellAccessSystemSelected);
}

有一堆按钮可以做不同的事情。如果站点有多个系统,则会显示 SystemViewPanel 以选择要在哪个系统上执行操作。按照我现在的方式,我必须订阅一个不同的命名事件处理程序来指定我想要执行的操作,因此我的主窗体代码变得困惑(即 ShellAccessSystemSelected、DownloadFileSystemSelected、ViewSystemSystemSelected 等)。

编辑

我认为事情可以一概而论,因为我将展示一个面板,允许用户为我的应用程序中的大多数工具 选择一个系统。但是,对于每个不同的工具,需要根据启动 SystemViewPanel 创建的工具执行不同的操作。

最佳答案

您可能希望通过插入您自己的基类来概括面板的行为,该基类公开您通常希望从面板中获得的那些事件。这可能是一个开始。 您还可以直接在构造函数中提供某些事件的处理程序...

SystemViewPanel panel = ShowPanel<SystemViewPanel>(
  this, 
  panel => {
    //Do the stuff you would do on click event, panel impl ensures this 
    // gets called at the right moment
  },
  CurrentSelectedSite.Systems);

因评论而更新:

您需要知道您的 lambda 需要哪些参数。如果您对标准事件处理程序的签名感到满意,您可以只使用“EventHandler”作为参数类型。然后你的 lambda 看起来像

(sender, args) => //Do stuff

除此之外,如果您调用的函数只需要面板,您可以使用 Action 委托(delegate)之一,它允许您用参数表达方法,但没有返回值。

如果您想从调用的 lmbda 返回一些值,然后由调用者(您的面板)处理,您可以使用任何 Func代表

关于c# - 如何处理对通用类型事件的订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1027884/

相关文章:

c# - 查看文档后不了解 ICollection 在 C# 中的作用

c# - 如何使用 Windbg 检查管理应用程序的 Int64

generics - 将 NUnit 与通用可区分联合结合使用

java - 内部类/接口(interface)中定义的泛型类型是否绑定(bind)到外部类泛型类型定义?

java - 在屏幕上放置 block 第 2 部分

c# - 解析标记范围和未标记范围中的组件

c# - 通过反射向List添加元素

java - 实例不工作?

jQuery : stop recursivity with event

jQuery鼠标的.click()是通过键盘导航启动的