什么是实施c#事件的正确方法

时间:2020-05-24 18:54:54

标签: c# events

我被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不知道攻击者或防御者是谁。

1 个答案:

答案 0 :(得分:1)

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

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

关于如何处理事件,您想在执行ChooseOpponent时通知其他类,对吗?您只需在OnChooseOpoonent();内调用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");
}

我希望这是有道理的。为了使事情更清晰,您可以阅读documentation,这可能比我能更好地解释这个概念。

相关问题