首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法中将自定义类属性作为lambda传递

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

Stack Overflow用户
提问于 2018-09-21 09:55:50
回答 3查看 321关注 0票数 4

这个项目的作用域只是一个控制台应用程序,当我试图传递值时,我遇到了一个非常恼人的错误:参数类型'lambda表达式‘不能分配给参数类型'DungeonRunner.Ability’

要传递参数的函数:

代码语言:javascript
复制
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;

                }

第一类指的是:

代码语言:javascript
复制
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;
        }
    }
}

这是我试图传递的值:

代码语言:javascript
复制
`MyCharacter.UseSpell(ability => ability.SpellName == spellname)`;

问题是:我怎样才能优化这个问题,这样错误就消失了。也许我需要改变参数。但我觉得这不需要。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-21 10:03:10

假设具有所有能力的列表称为“能力”,则可以编写以下代码;

代码语言:javascript
复制
Ability usedAbility = abilities.FirstOrDefault(x => x.SpellName1 == spellname);
if(usedAbility != null)
{
    MyCharacter.UseSpell(usedAbility);
}

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

票数 2
EN

Stack Overflow用户

发布于 2018-09-21 10:19:01

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

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

代码语言:javascript
复制
public void UseSpell(Ability ability)
{
    // do something with the provided ability
}

这样,你的客户必须寻找正确的能力。要做到这一点,它必须了解所有的能力:

代码语言:javascript
复制
UseSpell(myAbilities.FirstOrDefault(x => x.Spellname == "MySpell"));

另一个机会是UseSpell基于某种条件搜索Ability本身,您可以通过委托提供这些条件。但是,这假设UseSpell拥有access的所有功能,以便搜索“正确”的能力:

代码语言:javascript
复制
public void UseSpell(Func<Ability, bool> predicate)
{
    // get all abilities
    var allAbilties = ...;
    // get the one that matches the condition
    var ability = allAbilities.FirstOrDefault(predicate)
}

现在,客户端只提供了标准,而没有提供所有能力列表:

代码语言:javascript
复制
UseSpell(x => x.Spellname == "MySpell");

因此,取决于您的所有能力列表的位置,这一种或另一种方法可能更好。结果在这两种情况下是相同的。然而,语义是不同的。

票数 0
EN

Stack Overflow用户

发布于 2018-09-21 10:25:11

推荐信是错误的。执行以下操作

代码语言:javascript
复制
MyCharacter.Where(ability => ability.SpellName == spellname).Foreach(ability => UseSpell(ability));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52441145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档