不能从数组列表中调用对象的方法

本文关键字:对象 方法 调用 数组 列表 不能 | 更新日期: 2023-09-27 18:16:51

我在位于成就脚本的printAchiv()方法的ArrayList上从achievv类调用getName()方法,它抛出一个错误。

下面是我在Debug.Log("Achiv "+i+": "+ achivList[i].getName());上得到的错误信息:

键入object' does not contain a definition for getName'和no可以找到扩展方法getName' of type 对象'(您是否缺少using指令或程序集引用?)

我只是想访问var "name"从集合中的对象。

成就类:

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());
    }
}

不能从数组列表中调用对象的方法

使用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

问题是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());
        }
    }   
}

ArrayList操作对象。你需要将数组索引的结果强制转换为:

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