如何将另一个类中存在的Class方法作为List调用?

时间:2014-08-26 01:28:52

标签: c# list

我有一个List<>充满了一个名为'生物','生物'包含列表<>它充满了一个名为' AttackMethod'的单独的Class对象。 AttackMethod类的内部是一个名为' RollDamage'的公共int方法。它接受在AttackMethod内部分配的变量并计算它们以返回int。

我遇到的问题是从我的列表中调用RollDamage方法<>生物每个生物都有一个List<>其中的AttackMethods。我想要做的是访问每个生物的攻击方法列表<>并激活RollDamage方法。缩写代码如下:

private static void MobAttacksPlayer(Objects.Creature inMob)
{    
    MobDamage = (int)inMob.creatureAttacks.RollDamage();
    Console.Write(MobDamage);
}

creatureAttacks是List<>的公共变量在Creature类中。公众以前受过保护,上面的(int)铸造是我尝试的其他东西,但是没有用。

public List<AttackMethod> creatureAttacks = new List<AttackMethod>();

我确定它是一件我能忽视的简单事物;我对C#很新,但想尝试创建小Roguelike来学习。正如我在这里写的那样,我已经在右边列出了类似的问题,但没有成功。以下是我的AttackMethod类(修剪为仅包含构造函数和我尝试使用的RollDamage方法)

public class AttackMethod
    {
        protected string aFlag;
        protected string eFlag;
        protected int numberDice;
        protected int numberSides;

        public AttackMethod() { }

        public AttackMethod(string inaFlag, string ineFlag, int inNumdie, 
                            int inNumSides)
        {
            aFlag = inaFlag;
            eFlag = ineFlag;
            numberDice = inNumdie;
            numberSides = inNumSides;
        }

        ~AttackMethod() { }

        public int RollDamage()
        {
            DiceBag.Dice newDie = new DiceBag.Dice();
            int ret = newDie.any(numberDice, numberSides);
            return ret;
        }
    }

DiceBag只是​​我的模具滚筒,没有任何错误。此外,我不知道它是否有所作为,但这是一个控制台程序,而不是Windows窗体程序。我使用的是Visual C#Express 2010.请提前感谢您的帮助。

错误2&#39; System.Collections.Generic.List&#39;不包含&#39; RollDamage&#39;的定义没有扩展方法&#39; RollDamage&#39;接受类型&#39; System.Collections.Generic.List&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)C:\ Users \ Carl.Prichard \ Documents \ Visual Studio 2010 \ Projects \ MyRogueLike \ MyRogueLike \ Program.cs 1130 60 MyRogueLike

通常当我收到此错误时,将其转换为我要解析的变量类型

2 个答案:

答案 0 :(得分:2)

RollDamage方法损坏是AttackMethod类的成员。 inMob.creatureAttacks是一个列表,即List<AttackMethod>。此列表不会公开AttackMethod类中的任何方法,它只是公开List上的方法。您需要遍历列表以获取对每个生物攻击方法的引用。即...

foreach(AttackMethod attack in inMob.creatureAttacks)
{
    var mobDamage = (int)attack.RollDamage();
    Console.Write(mobDamage);
}

答案 1 :(得分:0)

您要做的是在列表的每个成员(RollDamage)上调用方法(creatureAttacks)。

你不能直接这样做&#34; on&#34;列表。您可以使用foreach遍历列表并一次一个地处理其中的每个对象。也许你想要这样的东西:

private static void MobAttacksPlayer(Objects.Creature inMob)
{    
    var totalDamage = 0;
    foreach (var attack in inMob.creatureAttacks) 
    {
        var attackDamage = attack.RollDamage();
        Console.Write(attackDamage);
        totalDamage += attackDamage;
    }
    Console.Write(totalDamage);
}

如果您只想总结攻击并且不关心各个值,则可以使用LINQ缩短代码(确保文件顶部的using System.Linq位于您的使用位置):

var totalDamage = inMob.creatureAttacks.Sum(t => t.RollDamage());