4

我找到了很多关于如何对事件(或委托)做出反应的资源。例如:

Control.ValueChanged += (sender, e) =>
        {
            //do something
        };

但是,我不知道如何创建自己的事件?基本上我有一个类需要“触发”一个事件,并且在创建这个对象的类中你可以对这个事件做出反应。

任何的想法?

如果我要使用 Delegate 来代替,我应该怎么做(创建我自己的可以由另一个类实现的 Delegate 对象)?

谢谢!

4

3 回答 3

8

你的意思是这样的?

class Foo
{
    public event EventHandler MyEvent;

    public void DoSomething()
    {
        // do stuff

        // raise the MyEvent event
        var handler = MyEvent;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}
于 2013-02-19T21:42:01.480 回答
2

我个人使用Actions。

public abstract class ServiceClient
{
    public Action OnNetworkActivityStarted { get; set; }

    private void StartNetworkActivity()
    {
        if (OnNetworkActivityStarted != null)
            OnNetworkActivityStarted();
    }
}

任何继承类都将/可以使用您在上面提供的逻辑。

public class MyClient : ServiceClient
{
    public MyClient()
    {
        this.OnNetworkActivityStarted += () => 
        {
            //do whatever the subclass needs to do when the event is fired
        };    
    }
}

我已经在我计划用于跨平台移动应用程序的类库中实现了这个。这允许每个设备实施自己的策略,让用户知道网络已经启动。

我希望这有帮助。

于 2013-02-19T22:45:30.883 回答
1

根据您的需要,您可以做两种不同的事情:

  • 您可以创建一个包含委托的变量(变量类型将是所述委托的)。当您希望能够在对象之外实现功能时,您通常会这样做。你也可以使用这个东西返回一个值,这样你就可以用它来改变对象的状态。

  • 您可以创建一个事件。当您希望能够防止某些对象在您的对象中发生某些事情时,您会这样做:您触发一个事件。您的对象根本不应该知道之后发生的事情。这通常是您在实现 View 时所做的,您会触发一些事件,以便 Controller 可以知道 View 中发生了什么。然后他可以决定之后如何处理视图。

第一个例子,名称检索没有在控制器中定义,它必须由外部设置。控制器不知道它是如何工作的,但它想检索一个整数 id 的名称。它的工作方式与接口相同:

public class MyController {
    private NameForIDFetcher NameFetcher { get; set; }
    private List<int> _ids = new List<int>();

    public delegate string NameForIDFetcher(int id);


    public void showNames() {
        if (this.NameFetcher == null) {
            throw new Exception("No NameFetcher set.");
        }

        foreach (int id in this._ids) {
            Console.WriteLine(id + ": " + this.NameFetcher(id));
        }
    }
}

第二个例子,当视图出现和消失时,视图可以阻止所有可能连接到事件的监听器。如果没有人连接,视图不应该改变它的行为(如果有人知道它应该的情况,请告诉我)。你可以注意到我第二次使用了 Action,它是一个通用的委托,它返回 void 并采用你在参数中提供的模板。您最多可以有 16 个模板参数,这意味着委托将采用 16 个参数,但这将是一个非常讨厌的委托,不是吗?

public class MyView {

    public event ViewAction onViewAppeared;
    public event Action<MyView> onViewDisappeared;

    public delegate void ViewAction(MyView view);

    public void show() {
        // Stuffs

        if (this.onViewAppeared != null) {
            this.onViewAppeared(this);
        }
    }

    public void hide() {
        // Stufs

        if (this.onViewDisappeared != null) {
            this.onViewDisappeared(this);
        }
    }
}
于 2013-02-19T23:21:43.357 回答