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

时间:2018-09-21 09:55:50

标签: c#

该项目的范围只是一个控制台应用程序,我很烦 尝试传递值时遇到的错误: 参数类型“ 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)`;

问题是:我如何才能对此进行优化,以使错误消失。 可能是我需要更改参数。但我认为这不是必需的。

3 个答案:

答案 0 :(得分:2)

假定具有所有能力的列表称为能力,您可以编写以下代码;

Ability usedAbility = abilities.FirstOrDefault(x => x.SpellName1 == spellname);
if(usedAbility != null)
{
    MyCharacter.UseSpell(usedAbility);
}

使用FirstOrDefault,您将获得第一个带有拼写名称的Ability。我添加了空检查,因为如果没有Ability的名称,您将从null中获得FirstOrDefault

答案 1 :(得分: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");

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

答案 2 :(得分:0)

引用是错误的。执行以下操作

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