所以我尝试着创造一款2D游戏(c#),其中玩家拥有不同的技能。问题是,我不知道如何使用包含技能名称的字符串调用函数。总是有另一种方法,那就是通过制作一个非常长的if语句列表来检查技能是否被命名,但这似乎远非理想。
假设一项技能被称为"skill1"。是否有任何方法来调用一个函数Skill1()使用字符串"Skill1"?这将有助于使代码看起来更好。
Thanks in advance
您正在寻找的是委托(更具体地说,是委托的字典)。
void Main()
{
var things = new Dictionary<string, Action>
{
{"Thing1", DoThing1},
{"Thing2", DoThing2},
{"Thing3", DoThing3},
};
things["Thing1"]();
things["Thing3"]();
things["Thing2"]();
}
public void DoThing1()
{
Console.WriteLine("In Do Thing 1");
}
public void DoThing2()
{
Console.WriteLine("In Do Thing 2");
}
public void DoThing3()
{
Console.WriteLine("In Do Thing 3");
}
有关更多信息,请搜索delegate, Actions和Funcs。
委托是一个很好的选择,但如果你想保持简单,你可以使用switch语句而不是if语句,这样更容易维护。
这是最基本的,但可能会有所帮助
static void Main(string[] args)
{
Console.WriteLine("call skill");
string _skill = Console.ReadLine();
CallSkills(_skill);
}
public static void CallSkills(string skillname)
{
switch (skillname)
{
case "skill1":
//call skill1 method
break;
case "skill2":
//call skill2 method
break;
case "skill3":
//call skill3 method
break;
case "skill4":
//call skill4 method
break;
case "skill5":
//call skill5 method
break;
default:
break;
}
}
对委托使用字典的另一种选择是对委托使用switch表达式。
一种可能的方法是创建一个方法,将所有相关的技能名称与适当的Skill*
方法相关联,以及使用丢弃模式(_ => ...
;这里:_ => null
)为任何不匹配表达式中任何已定义技能名称的skillName
定义默认值:
private static Action GetSkillAction(string skillName)
{
return skillName switch
{
"Skill1" => Skill1,
"Skill2" => Skill2,
_ => null
};
}
为了更容易地使用该方法,您可以创建一个方法来实际执行技能(通过技能名称)。这个方法处理接收一个不存在的技能,如果动作不像null
:
public static void PerformSkillAction(string skillName)
{
var action = GetSkillAction(skillName);
if (action != null)
{
action();
}
}
现在,调用
PerformSkillAction("Skill1");
将导致对Skill1()
的调用,而调用
PerformSkillAction("Banana");
将不调用任何东西。
示例在这里。