不能从数组列表中调用对象的方法
本文关键字:对象 方法 调用 数组 列表 不能 | 更新日期: 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>
代替ArrayList
。ArrayList
是过时的,不应该再使用类型安全。
ArrayList
的索引器返回object
,这就是为什么你得到错误。
public List<Achiv> achivList = new List<Achiv>();
除此之外,
- 不要公开
List
,选择ReadOnlyCollection
或IEnumerable
。 - 首选
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()