c# - 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
不知道攻击者或防御者是谁。
解决方案
我已经可以在您的代码中看到一些编译错误。
首先,是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");
}
我希望这是有道理的。为了搞清楚,你可以阅读这个文档,它可能比我能更好地解释这个概念。
推荐阅读
- mongodb - 如何使用 MongoRepository 更新 mongodb 中的几个字段?
- nginx - NGINX 反向代理 - 预加载缓存
- javascript - 为什么Material-UI Dialog在按下按钮时会消失?
- azure - 如何使用 Azure Logic App 中的文本值填充 Dynamics 365 查找?
- php - PHP - Implode,Explode 有时有效,有时无效?
- json - 通过更改 JMeter 中的请求正文创建多个 GET 请求
- java - Jtextpane 字符串编辑器
- razorpay - 在 curl 请求中输入正确的密码 razorpay 时出现 Bad_Request
- excel - 如何打开以工作表中的单元格命名的工作簿?
- python-3.x - Tkinter 'sticky' 和 'rowconfigure' 都没有填满空白空间