无法从arraylist中调用我的方法

时间:2014-08-07 11:30:44

标签: c# collections unity3d

所以我的问题是: 我正在尝试从位于Achievements脚本中的方法printAchiv()中的ArrayList上的Achiv类调用方法getName(),它显然不起作用。

以下是我在Achievements脚本中获取此行的错误消息:   - > Debug.Log(“Achiv”+ i +“:”+ achivList [i] .getName());

  

输入object' does not contain a definition for getName'并且不输入   可以找到扩展方法getName' of type object'(是吗?   缺少using指令或程序集引用?)

我只是想从集合中的obejct访问var“name”的值。

Achiv课程

using UnityEngine;
using System.Collections;

public class Achiv : MonoBehaviour {

        public string name;

        public Achiv(string name )
        {
            this.name= name;
        }

        public string getName()
        {
            return name;
        }
}

成就剧本

    using UnityEngine;
    using System.Collections;

    public class Achievements: MonoBehaviour {

        public  ArrayList achivList = new ArrayList();

        void Start () 
        {
            achivList.Add (new Achiv("First name", "Descirptionn", false));
            achivList.Add (new Achiv("Second name", "Descirptionnn", false));

            printAchiv();
        }

        void printAchiv(){

            for (int i = 0; i <= achivList.Count - 1; i++)
                Debug.Log("Achiv "+i+": "+ achivList[i].getName());
        }   
    }

3 个答案:

答案 0 :(得分:3)

使用List<Achiv>代替ArrayListArrayList过时,不再使用,不应再使用。

ArrayList的索引器会返回object,这就是您收到错误的原因。请尝试以下方法。

public List<Achiv> achivList = new List<Achiv>();

除此之外,

  • 不要公开List,首选ReadOnlyCollectionIEnumerable
  • 除非有充分理由,否则请foreach优先于for
  • printAchiv没有遵循正确的命名惯例,在c#中我们使用“CamelCase”,将其重命名为PrintAchiv
  • get / set方法适用于不支持属性的java风格语言。在c#中,我们使用属性。创建一个属性Name

答案 1 :(得分:1)

ArrayList与Objects一起运行。您需要将数组索引的结果转换为Achieve:

(achivList[i] as Achiv).getName()

答案 2 :(得分:0)

问题是ArrayList中的元素存储为object。因此achivList[i]会返回object,但不提供getName()方法。 您可以添加演员阵容:

            Debug.Log("Achiv "+i+": "+ (Achiv)achivList[i].getName());

或者您可以切换到通用列表:

using UnityEngine;
using System.Collections.Generic;

public class Achievements: MonoBehaviour {


    public  List<Achiv> achivList = new List<Achiv>();


    void Start () {

        achivList.Add (new Achiv("First name", "Descirptionn", false));
        achivList.Add (new Achiv("Second name", "Descirptionnn", false));


        printAchiv();

    }


    void printAchiv(){

        for (int i = 0; i <= achivList.Count - 1; i++)
        {

            Debug.Log("Achiv "+i+": "+ achivList[i].getName());
        }
    }   
}