调用具有不同字符串名称的函数



所以我尝试着创造一款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");

将不调用任何东西。

示例在这里。

相关内容

  • 没有找到相关文章

最新更新