Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法中将自定义类属性作为lambda传递_C# - Fatal编程技术网

C# 在方法中将自定义类属性作为lambda传递

C# 在方法中将自定义类属性作为lambda传递,c#,C#,这个项目的范围只是一个控制台应用程序,我有一个非常恼人的问题 尝试传递值时出现的错误: 参数类型“lambda expression”不可分配给参数类型“DungeonRunner.Ability” 我要在其中传递参数的函数: public void UseSpell(Ability ability) { var SpellToUse = this.CharClass.GetAbilities(); //Ge

这个项目的范围只是一个控制台应用程序,我有一个非常恼人的问题 尝试传递值时出现的错误: 参数类型“lambda expression”不可分配给参数类型“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)`;
问题是:我怎样才能优化它,使错误消失。
可能我需要更改参数。但是我认为没有必要这样做。

假设包含所有能力的列表被称为能力,那么您可以编写以下代码

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

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

第一个是为您的方法提供实际的
功能
,并让它对该实例执行某些操作:

public void UseSpell(Ability ability)
{
    // do something with the provided ability
}
这样,您的客户必须搜索正确的能力。要做到这一点,它必须了解所有能力:

UseSpell(myAbilities.FirstOrDefault(x => x.Spellname == "MySpell"));
UseSpell(x => x.Spellname == "MySpell");
另一个机会是,
UseSpell
根据某个条件搜索
能力
本身,该条件可以由代表提供。但是,这假设
UseSpell
具有访问所有技能的权限,以便搜索“正确”的技能:


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

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

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

为什么不调用方法
MyCharacter.UseSpell(能力)
?是否要提供具有指定的
拼写名称的
能力
?@HimBromBeere是。它保存在列表中。为
UseSpell
提供一个委托,假设该方法通过迭代列表来搜索正确的能力本身。另一方面,如果您为该方法提供了某种
能力
,则必须由客户端在前面进行搜索。然而,你到底想要什么还不清楚。
是否应该使用拼写
期望具有
能力
或搜索匹配的能力?感谢您的解决方案。我很难理解lambda的表达:)
MyCharacter.Where(ability => ability.SpellName == spellname).Foreach(ability => UseSpell(ability));