首页 > 解决方案 > c#事件的正确实现方式是什么

问题描述

我被 C# 代码中的事件实现所困扰。我有类Characters,其中包含名称、HP、DMG 和 DEF。然后我有几个随机敌人和一个基于Characters职业的英雄。

接下来我有方法,什么是随机攻击者和随机防御者。这意味着 - 我有英雄、龙和狼。该方法将选择随机角色,比如说英雄并将他标记为“防御者”。然后它会在龙和狼之间随机选择,并将其标记为“攻击者”。我想创建一个将在此方法内触发的事件,它将显示反对哪些字符。即“英雄选择了龙作为他的对手”。

我试过了

public delegate void ChooseOpponentEventHandler(object source, EventArgs args);
public event ChooseOpponentEventHanlder ChooseEvent;

//Method for choosing random enemy
abstract public bool ChooseAttacker(string Attacker, string Defender);
virtual public bool ChooseOpponent(string Attacker, string Defender, int OppNum, int AttNum)
{
   if(ChooseAttacker(Attacker, Defender) == true && AttNum != OppNum 
   {
      return true;
   }
else return false;
}

protected virtual void OnChooseOpponent()
{
   if (ChooseEvent != null)
   ChooseEvent(this, Event.Args.Empty);
}

我不知道如何将方法OnChooseOpponent()放在ChooseOpponent()方法中,也不知道如何让方法说

Console.WriteLine(Attacker.Name + "has chosen" + Defender.Name + " as his opponent") 

或类似的东西,因为方法OnChooseOpponent不知道攻击者或防御者是谁。

标签: c#events

解决方案


我已经可以在您的代码中看到一些编译错误。

首先,是EventArgs,不是Event.Args。然后,攻击者和防御者是字符串。它们不包含 .Name 属性或字段。

至于如何处理您的事件,您希望在执行 ChooseOpponent 时通知其他类,对吗?你应该做的只是简单地调用OnChooseOpoonent();inside ChooseOpponent

为了让另一个类得到通知,他们应该有这个类的一个实例,假设它是命名的otherClass。你需要做的是:

otherClass.ChooseEvent += EventChosen;

void EventChosen(object sender, EventArgs e)
{
    Console.WriteLine("The event was chosen.");
}

现在,如果您还想通过事件传递一些额外的数据,您必须创建一个单独的类,该类将与您的事件一起传输:

public class ChooseEventArgs : EventArgs
{
   public string Attacker {get; set;}
   public string Defender {get; set;}
}

当您触发事件时,它应该是:

protected virtual void OnChooseOpponent(string attacker, string defender) 
{
    if (ChooseEvent != null)
    ChooseEvent(this, new ChooseEventArgs{Attacker = attacker, Defender = defender});
}

编辑:正如 Gserg 建议的那样,触发(调用)事件的正确方法是使用这段代码:

protected virtual void OnChooseOpponent(string attacker, string defender) 
{
    ChooseEvent?.Invoke(this, new ChooseEventArgs{Attacker = attacker, Defender = defender});
}

在您的其他类中,您可以更改将处理事件的方法的签名,如下所示:

void EventChosen(object sender, ChooseEventArgs e)
{
    Console.WriteLine(e.Attacker + " has chosen " + e.Defender + " as his opponent");
}

我希望这是有道理的。为了搞清楚,你可以阅读这个文档,它可能比我能更好地解释这个概念。


推荐阅读