将自定义类属性作为lambda表达式传递给方法

4

这个项目的范围只是一个控制台应用程序,我遇到了一个非常烦人的错误。当我尝试传递值时,我收到以下错误信息:

参数类型“lambda表达式”不能分配给参数类型“DungeonRunner.Ability”。

我想要传递参数的函数如下:

public void UseSpell(Ability ability)
            {
                var SpellToUse = this.CharClass.GetAbilities();
                //Get all Abilites
                this.CharClass.GetAbilities();
                if (this.MP == 0)
                {
                    Console.WriteLine("You cannot use advanced Abilities, drink a Mana Potion to restore Mana");
                    var UsedSpell = SpellToUse.First();
                    this.MP -= UsedSpell.ManaCost1; //This line is unnecessary because the first spell costs nothing

                }
                else if(this.MP >= 0)
                {

                    var UsedSpell = SpellToUse.Find(abilityName => abilityName.SpellName1 == ability.SpellName1);
                    this.MP -= UsedSpell.ManaCost1;

                }

我要参考的类:

namespace DungeonRunner
{
    public class Ability
    {
        private int ManaCost;
        private int SpellDamage;
        private string SpellName;

        public Ability(int manaCost, int spellDamage, string spellName)
        {
            ManaCost = manaCost;
            SpellDamage = spellDamage;
            SpellName = spellName;
        }

        public int ManaCost1
        {
            get => ManaCost;
            set => ManaCost = value;
        }

        public int SpellDamage1
        {
            get => SpellDamage;
            set => SpellDamage = value;
        }

        public string SpellName1
        {
            get => SpellName;
            set => SpellName = value;
        }
    }
}

这是我要传递的值:

`MyCharacter.UseSpell(ability => ability.SpellName == spellname)`;

问题是:我如何优化这个问题,使错误消失。也许我需要更改参数,但我认为不需要。

为什么不调用方法 MyCharacter.UseSpell(ability); 呢? - Mighty Badaboom
你想提供具有指定“SpellName”的“Ability”吗? - MakePeaceGreatAgain
@HimBromBeere 是的。它已保存在列表中。 - samuel gast
提供一个委托给 UseSpell,假设该方法通过迭代列表自行搜索正确的能力。另一方面,如果您向该方法提供特定的 Ability,则客户端必须在前面进行搜索。然而,您实际上想要什么并不清楚。UseSpell 应该期望一个 Ability 还是搜索匹配的 Ability - MakePeaceGreatAgain
3个回答

2
假设包含所有技能的列表被称为 abilities,您可以编写以下代码:
Ability usedAbility = abilities.FirstOrDefault(x => x.SpellName1 == spellname);
if(usedAbility != null)
{
    MyCharacter.UseSpell(usedAbility);
}

使用FirstOrDefault,您可以获取第一个具有指定法术名称的Ability。我添加了空值检查,因为如果没有该名称的Ability,则会从FirstOrDefault返回null


谢谢你的解决方案。我对 lambda 表达式感到很困惑 :) - samuel gast

0

实际上有两种方法可以做到。

第一种是向您的方法提供实际的Ability,并让它对该实例执行某些操作:

public void UseSpell(Ability ability)
{
    // do something with the provided ability
}

这样你的客户就必须搜索正确的能力。为此,它必须了解所有的能力:

UseSpell(myAbilities.FirstOrDefault(x => x.Spellname == "MySpell"));

另一个机会是,UseSpell 根据您提供的委托条件自行搜索 Ability。但是这假定 UseSpell 可以访问所有能力以搜索“正确”的能力:
public void UseSpell(Func<Ability, bool> predicate)
{
    // get all abilities
    var allAbilties = ...;
    // get the one that matches the condition
    var ability = allAbilities.FirstOrDefault(predicate)
}

现在客户端只提供标准,但不提供完整的能力列表:

UseSpell(x => x.Spellname == "MySpell");

因此,根据您的所有能力列表所在的位置,其中一种方法可能更好。但是,在两种情况下结果是相同的。然而,语义是不同的。


0

参考文献有误。请按照以下步骤进行操作。

MyCharacter.Where(ability => ability.SpellName == spellname).Foreach(ability => UseSpell(ability));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接