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