通过事件传递参数

时间:2013-06-05 09:51:35

标签: c# events event-handling parameter-passing begininvoke

我在多个项目中有多个类,这些类可以通过中介类相互访问。

目前发生的是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类没有直接关系。

最后,我所做的是创建一个自定义事件和一个自定义事件Args,其中包含我想要使用的所有字段。

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);

1 个答案:

答案 0 :(得分:1)

如果您无法更改方法,则必须通过其他方式传递值

1)属性可以是一个选项,在C中有一个属性,让它从B分配。

2)写入重载方法,接受一个参数并为你完成工作,这样你就不必改变从多个地方调用的现有方法。