【发布时间】:2013-06-05 09:51:35
【问题描述】:
我在多个项目中有多个类,这些类可以通过中介类相互访问。
目前发生的事情是 A 类触发和事件,它由 B 类(中介)中的一个方法处理,该方法触发一个在 C 类中处理的事件。这是我可以交流的唯一方式A 到 C。
但是,在 A 类中触发事件的方法中,我有一个我想在 C 类中使用的 int 变量。
是否有任何方法可以将它作为对象传递,仅在 C 类中我无法访问信息,我什至尝试将 e 转换为类类型。也许有一种更简单的方法,我尝试只是添加到参数和 int 参数中,但是我使用的是 beginInvoke,它不会接受我无法更改此方法,因为它在代码的其他地方使用。
protected virtual void OnProcessing(EventHandler handler, EventArgs args, int p)
{
var temp = handler;
if (temp != null)
{
var eventListeners = temp.GetInvocationList();
foreach (EventHandler e in eventListeners)
{
e.BeginInvoke(this, args, EndAsyncImageAcquiredEvent, p);
}
}
else
{
throw new FatalException("No handler is attached to the camera's ImageAcquiredEvent");
}
}
这是 A 类中触发事件的方法
progressPercentage = (int)Math.Round(sum, 0);
OnProcessing(startProcess, null);
这里的 Onprocessing 是从一个方法调用的,我想传递给这个方法 progressPercentage ,但想知道是否有一种方法可以通过使用参数或对象来执行此操作,以及我将如何在另一个上检索它侧面即c类
编辑
抱歉,当我写这篇文章时,大家对 stackoverflow 有点陌生。我想问的是,是否有任何方法可以将 Title、ProgressPercentage、UserState、DisplayPercentage 等字段从 A 类传递到 C 类。需要 B 类,以便 C 类和 A 类没有直接关系。
最后我所做的是创建一个自定义事件和一个自定义事件参数,其中包含我想要使用的所有字段。
public event ProgressHandler StartProgress;
ProgressHandler 是我的自定义事件,是这样组成的,
public delegate void ProgressHandler(object sender, ProgressEventArgs e);
ProgressEventArgs 是我的习惯参数,或者是我将用来存放我的数据的对象
public ProgressEventArgs(string title, int progressPercentage, bool displayPercentage, object userState) : base (progressPercentage, userState)
{
Title = title;
ProgressPercentage = progressPercentage;
UserState = userState;
DisplayPercentage = displayPercentage;
}
所以事件在 A 类中被触发并在 B 类中处理。然后 B 类获取这些数据并触发一个新事件,然后 C 类处理这个。
Class A => Class B
Class B => Class C
所以要将我的字段添加到我的自定义对象中,
ProgressEventArgs e = new ProgressEventArgs("SomeName", 25, null, true);
然后为了传递这些数据,我触发了一个事件
StartProgress(null, e);
【问题讨论】:
-
添加您的代码以及您到目前为止所尝试的内容会有所帮助
-
我假设这些事件是自定义事件。因此,您可以指定要作为参数传递的内容(例如
A实例)。使用此int在A类中添加一个属性,然后将A作为发件人传递给B,在这里您可以将其与此自定义事件一起传递给C或使用B中的属性。跨度> -
传递参数应该很简单。您的问题没有包含足够的代码/细节来理解问题。
-
代码帮助不大。请注明 A、B 和 C 以及可以更改的部分。
-
好吧,不要使用 EventArgs 也不要使用 null。例如,使用 ProgressChangedEventArgs。并且不使用 BeginInvoke(),订阅事件的任何代码都不会期望事件处理程序在任意线程池线程上运行。
标签: c# events event-handling parameter-passing begininvoke