运行arraylist中包含的对象的成员函数?

时间:2012-02-22 21:22:28

标签: c#

基本上我有一个不同类型对象的arraylist都有Draw()函数。我想使用循环来运行每个对象的绘图功能。但是C#告诉我类型“对象”没有这个功能。任何想法都是低n00b?

6 个答案:

答案 0 :(得分:3)

应在接口中定义Draw方法:

public interface IDrawable 
{
    void Draw();
}

所有其他类(使用.Draw方法)都应该实现此接口。您的列表应为List<IDrawable>。然后,您可以按预期方式在每个项目上调用.Draw方法:

List<IDrawable> list = new ...;
foreach (var item in list) 
{
    item.Draw();
}

答案 1 :(得分:1)

除非您使用的是.NET 1.1,否则您不应该使用ArrayList

如果你在谈论UI元素,他们都应该实现IDrawable接口。如果它们是您的自定义类型,您也应该在这些类上实现IDrawable接口。然后,您可以使用通用List<T>来存储它们。

List<IDrawable> objects = new List<IDrawable>();

// Fill the list

// Iterate over each object and call Draw()
foreach(IDrawable obj in objects)
{
    obj.Draw();
}

答案 2 :(得分:0)

他们都应该实现IDrawable接口。你的arraylist可能想要包含一个IDrawable而不是object的列表。

答案 3 :(得分:0)

如果他们共享一个公共接口,你可以转换到该接口。

如果已知并修复了类型数,请尝试使用AS运算符强制转换为每种已知类型。

否则你将不得不求助于反思,就像这样

for (i...){
    object oneObject = arrayList[i];
    Type objectType = oneObject.GetType();
    objectType.GetMethod("Draw").Invoke(oneObject, new object[0]);
}

但是,如果你需要诉诸反射,这是一个巨大的代码味道,应该真的避免。

答案 4 :(得分:0)

使用ArrayList所有元素都存储为Object类型。要调用在antother类型上定义的函数,首先需要将成员转换为该类型。

class MyType { 
  public void Draw() {
    ...
  }
}

for (int i = 0; i < arrayList.Count; i++) {
  MyType current = (MyType)arrayList[i];
  current.Draw();
}

此代码仅适用于存储在ArrayList中的对象可转换为MyType的情况。如果您使用的是.Net 2.0或更高版本,请完全避免ArrayList,而是使用List<MyType>。这是一个强类型的集合,根本不需要演员。

List<MyType> list = ...;
for (int i = 0; i < list.Count; i++) {
  list[i].Draw();
}

答案 5 :(得分:0)

如果您使用的是C#4或更高版本,则可以使用动态类型:

foreach (dynamic obj in arrayList)
    obj.Draw();

如果您的类型缺少匹配的Draw()签名,则在运行时会失败。

如果您使用的是早期版本的C#,则可以使用反射。

话虽如此,你真的不应该使用ArrayList,除非你被一些遗留图书馆强迫。正如其他人所说,更惯用的解决方案是拥有IDrawable界面和List<IDrawable>