【问题标题】:c# delegate and event handler between two classesc# 两个类之间的委托和事件处理程序
【发布时间】:2017-06-09 17:10:44
【问题描述】:

我正在学习委托和事件处理程序,因为我需要在我的代码中。在示例中,Class Test 生成消息 Hello, i'm an event!
从这个 Class 我需要调用 Class Test1 中的方法 Evento1,以生成消息 Hello ,我是另一个事件!但我做不到。
我尝试实例化 Class Test1 并调用该方法。调试器编译但第二条消息没有出现。

namespace Eventi1
{
    // Delegate declaration
    delegate void testEventHandler(object source, string message);
    class Test
    {
        // Event
        public event testEventHandler testEvento;

        // Function that triggers the event
        public void Evento(string message)
        {
            Console.WriteLine("Event!");
            if (testEvento != null)
            { testEvento(this, message); }

            Test1 evento = new Test1();
            evento.Evento1("Hello, i'm another event!");
        }
    }

    class Test1
    {
        // Event1
        public event testEventHandler testEvento;

        // Function that triggers the event
        public void Evento1(string message)
        {
            Console.WriteLine("Event1!");
            if (testEvento != null)
            { testEvento(this, message); }
        }
    }

    public class EventSample
    {
        // Constructor
        public EventSample() { }
        static void Main()
        {
            // Classe instantiation
            Test b = new Test();

            // Event handler
            //b.testEvento += new testEventHandler(onTestAction);
            b.testEvento += onTestAction;

            // Event invocation
            b.Evento("Hello, i'm an event!");
        }

        // Function that triggers the event
        public static void onTestAction(object source, string message)
        {
            Console.WriteLine("We're inside the event handler.");
            Console.WriteLine("Messagge: " + message);
            Console.ReadLine();
        }
    }
}

PS第二个问题给Aansari

class Test
{
    public delegate void testEventHandler(object source, string message);
    public event testEventHandler testEvento;

    // Function that triggers the event
    public void Evento(string message)
    {
        Console.WriteLine("Event!");
        if (testEvento != null)
        { testEvento(this, message); }

        Test1 evento = new Test1();
        evento.testEvento += testEvento;
        evento.Evento1();
    }
}

class Test1
{
    public delegate void testEventHandler(object source, string message);
    public event testEventHandler testEvento;

    // Function that triggers the event1
    public void Evento1()
    {
        Console.WriteLine("Event1!");
        if (testEvento != null)
        { testEvento(this, "Hello, i'm another event!"); }
    }
}

public class EventSample
{
    public EventSample() { }
    static void Main()
    {
        Test b = new Test();
        b.testEvento += onTestAction;
        b.Evento("Hello, i'm an event!");
    }

    // Function that triggers the event
    public static void onTestAction(object source, string message)
    {
        Console.WriteLine("We're inside the event handler.");
        Console.WriteLine("Messagge: " + message + "\n");
        Console.WriteLine("Press ENTER");
        Console.ReadLine();
    }
}

【问题讨论】:

  • 我尝试实例化 Class Test1 并调用该方法。调试器编译,但没有出现第二条消息。 正确,因为您还没有订阅Test1 类中的testEvento(您只订阅了Test 类中的事件)。请注意,您订阅的只是该特定实例的事件,而不是“跨类的通用命名事件”,甚至是同一类的多个实例。
  • 谢谢你,但不幸的是,我对你告诉我的内容知之甚少。您能否以更简单的方式解释或更正代码。再次感谢

标签: c# class delegates event-handling


【解决方案1】:

加入以下更改,它会给你预期的结果

Test1 evento = new Test1();
evento.testEvento += testEvento;
evento.Evento1("Hello, i'm another event!");

您的代码中的问题是,尽管您将事件处理方法分配给 Test 类事件处理程序,但您没有将任何事件处理方法分配给 Test1 类事件处理程序。

【讨论】:

  • 如果我移动delegate void testEventHandler(object source, string message); iside Class Test 和 Test1 会怎样? evento.testEvento += testEvento; 生成:您不能将“Events1.Test.testEventHandler”类型隐式转换为“Events1.Test1.testEventHandler”
  • 委托有类型兼容的概念。请通过这个Type compatibility and Parameter compatibility of delegates in C#
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多