Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用事件集中信息_C#_Events_Interface - Fatal编程技术网

C# 使用事件集中信息

C# 使用事件集中信息,c#,events,interface,C#,Events,Interface,以下是我试图实现的目标的解释: 我有一个文本框,用作窗体上的“调试”或“信息”窗口。我想做的是让我创建的任何类在有信息发布到调试窗口时抛出一个事件,然后让文本窗口订阅所述事件,并在每次出现新内容时发布。我正在努力使我的类不需要了解文本框,但仍然能够将所有信息传递给文本框 是否可能在类之间有一个“共享”事件(可能使用接口),这样我只需要订阅一个事件,它就会从抛出该事件的所有类中提取 就视觉而言,它基本上是这样的: Public delegate void DebugInfo(string cont

以下是我试图实现的目标的解释:

我有一个文本框,用作窗体上的“调试”或“信息”窗口。我想做的是让我创建的任何类在有信息发布到调试窗口时抛出一个事件,然后让文本窗口订阅所述事件,并在每次出现新内容时发布。我正在努力使我的类不需要了解文本框,但仍然能够将所有信息传递给文本框

是否可能在类之间有一个“共享”事件(可能使用接口),这样我只需要订阅一个事件,它就会从抛出该事件的所有类中提取

就视觉而言,它基本上是这样的:

Public delegate void DebugInfo(string content)

Class foo1
{
   event DebugInfo DebugContentPending

   public void bar()
   {
      DebugContentPending("send this info to the debug window")
   }
}

Class foo2
{
   event DebugInfo DebugContentPending

   public void bar()
   {
      DebugContentPending("send this info to the debug window")
   }
}


Class SomeClass
{
    public void SomeMethod()
    {
       DebugContentPending += new DebugInfo(HandleContent);  //gets events from foo1 and foo2
    }

    public void HandleContent(string content)
    {
       //handle messages
    }
}

这是可能的还是我疯了?

很可能你不需要活动

class DebugLogger
{
    public DebugLogger(TextBox textBox)
    {
        this.TextBox = textBox;
    }

    public TextBox TextBox { get; private set; }

    public static DebugLogger Instance { get; set; }

    public void Write(string text)
    {
        this.TextBox.Text += text;
    }
}
初始化:

DebugLogger.Instance = new DebugLogger(textBox1);
用法:

DebugLogger.Instance.Write("foo");

请注意,代码不是线程安全的。有关更多信息,请参阅和相关。

您很可能不需要事件

class DebugLogger
{
    public DebugLogger(TextBox textBox)
    {
        this.TextBox = textBox;
    }

    public TextBox TextBox { get; private set; }

    public static DebugLogger Instance { get; set; }

    public void Write(string text)
    {
        this.TextBox.Text += text;
    }
}
初始化:

DebugLogger.Instance = new DebugLogger(textBox1);
用法:

DebugLogger.Instance.Write("foo");

请注意,代码不是线程安全的。有关更多信息,请参阅和相关。

一个问题:与创建公共静态类相比,这给了我什么?@DavidTorrey:您不能实例化它,但需要实例化。此外,如果您想声明表单/文本框的实例,您也没有从静态构造函数中引用该实例。您得到的此类实例不在此类范围内。@DavidTorrey:但是,您可以将包含实例引用的类与实际引用的类实例分开。但是为什么呢?关注点分离?也许是。一个问题:这比仅仅创建一个公共静态类给了我什么?@DavidTorrey:你不能实例化它,但你需要。此外,如果您想声明表单/文本框的实例,您也没有从静态构造函数中引用该实例。您得到的此类实例不在此类范围内。@DavidTorrey:但是,您可以将包含实例引用的类与实际引用的类实例分开。但是为什么呢?关注点分离?可能是。