C#事件消息

C#事件消息,c#,events,C#,Events,这是一个基本的问题,但我只是从编码开始, 我试图创建一个事件的消息,但它不允许我 namespace Homework_Excercise { public delegate void bdateHandler(); class Program { static void Main(string[] args) { Person p = new Person(); Console.Writ

这是一个基本的问题,但我只是从编码开始, 我试图创建一个事件的消息,但它不允许我

namespace Homework_Excercise
{
    public delegate void bdateHandler();

    class Program
    {

        static void Main(string[] args)
        {
            Person p = new Person();
            Console.Write("Enter your name: ");
            p.name = Console.ReadLine();
            string tmp = p.name;
            p.happybday += new bdateHandler(bday_msg(tmp));
            Console.Write("Enter your age: ");
            p.age = int.Parse(Console.ReadLine());    
        }
        static void bday_msg(string name)
        {
            Console.WriteLine("Happy birthday to you!\nHappy birthday to you!\nHappy birtday dear {0}!", name);
        }
    }
}
二等舱:

namespace Homework_Excercise
{
    class Person
    {
        public event bdateHandler happybday;

        private int Age;

        public int age
        {
            get { return Age; }
            set { Age = value; }
        }
        private string Name;

        public string name
        {
            get { return Name; }
            set { Name = value; }
        }
    }
}

你的第一个问题是

  p.happybday += new bdateHandler(bday_msg(tmp));
应该是

  p.happybday += new bdateHandler(bday_msg);
因为您应该指定一个方法,而不是方法的结果。接下来你的问题是 您的自定义代理应该接受
String
值(因为
bday\u msg
接受),而它不接受

更好的方法是使用标准EventHandler而不是自定义委托:

class Person {
  // there's a good standard class for it, do not re-invent the wheel
  public event EventHandler HappyBirthday;
  ...
}
...
static void Main(string[] args) {
  Person p = new Person();
  ...
  // assign the method, not its result
  p.HappyBirthday += bday_msg;
  ...
}

static void bday_msg(Object sender, EventArgs args) {
  Person person = sender as Person;

  // So you have Person and you can take any property you like, e.g. "name"
  Console.WriteLine("Happy birthday to you!\nHappy birthday to you!\nHappy birtday dear {0}!", person.name);
}
最后,您必须引发事件:在
Person
类中的某个地方应该出现类似

  if (null != HappyBirthday)
    HappyBirthday(this, EventArgs.Empty);

您需要在
Person
类中进行一些修改,并替换
p.happybday+=newbdatehandler(x=>bday_msg(tmp))
p.happybday+=bday\u msg来自
Main
方法

namespace Homework_Excercise
{
    class Person
    {
        public delegate void bdateHandler(string message);
        public event bdateHandler happybday;
        public void RaiseEvent(string message)
        {
            if (happybday != null)
            {
                happybday(message)
            }
        }
        private int _age;

        public int age
        {
            get 
            { 
                 return _age; 
            } 
            set 
            { 
                 _age = value;
                 if (/*condition with age*/)
                 {
                     RaiseEvent(Name);
                 } 
            }
        }
        private string Name;

        public string name
        {
            get { return Name; }
            set { Name = value; }
        }
    }
}

让我们运行创建事件的公认方法,首先,如果希望事件具有参数,请创建一个包含这些参数的类:

public class BirthdayEventArgs : EventArgs
{
    public string Message { get; private set; }

    public BirthdayEventArgs(string message) { Message = message; }
}
您可以看到,这个类派生自
EventArgs
,它是事件参数的公共基类。该类没有做太多的工作,只是将
消息
分配给
消息
属性,但是可以对其进行扩展以包含其他信息

接下来,让我们看看如何实现
Person
类来处理此事件:

public class Person
{
    public event EventHandler<BirthdayEventArgs> HappyBirthday;

    public int Age { get; set; }
    public string Name { get; set; }

    public void ItsMyBirthday()
    {
        if (HappyBirthday != null)
            HappyBirthday(this,
                new BirthdayEventArgs(
                    string.Format("{0} birthday is today and is {1} years old!",
                    Name, Age)));
    }
}
这与您现有的非常简单,但是您可以将其更改为接受用户的输入。事件处理程序声明为
p.HappyBirthday+=HappyBirthday其中右侧的
HappyBirthday
与事件的代表签名匹配

在事件处理程序中,您会得到一个
发送方
,它是引发事件的
Person
的盒装版本,以及事件参数对象


如果要查看此运行,请查看

您遇到了什么错误?什么意思它不允许你?你没有在任何地方举办活动。你应该看看如何举办活动。您将找到有关如何提出这些问题的教程。在进行此练习之前,您应该尝试在MSDN上练习该示例,以更清楚地了解事件您的委托不接受字符串参数,但您尝试向其提供的方法是
bday\u msg
应该是
bday\u msg(对象发送方,EventArgs args)
匹配
事件处理程序的签名
@Erik:谢谢!我已经编辑了代码(包括引发事件时的
EventArgs.Empty
)+1,以便在结尾使用Yoda时态。OP(和其他人)的教训:作为一种良好的防御性编码实践,始终首先比较常量,然后比较对象。否则,如果(HappyBirthday=null){…}
最终写入
,然后失败。
public class Program
{
    public static void Main(string[] args)
    {
        //Create the person
        Person p = new Person() { Name = "Joe Smith", Age = 142 };

        p.HappyBirthday += HappyBirthday;  //Subscribe to the event

        p.ItsMyBirthday(); //Raises the event

        Console.WriteLine("Press any key to quit");
        Console.ReadKey(true);
    }

    static void HappyBirthday(object sender, BirthdayEventArgs e)
    {
        //sender is the Person, and it has event arguments
        Console.WriteLine(e.Message);
    }
}