C# 是否运行arraylist中包含的对象的成员函数?

C# 是否运行arraylist中包含的对象的成员函数?,c#,C#,基本上,我有一个包含不同类型对象的arraylist,这些对象都有一个Draw()函数。我想使用一个循环来运行每个对象的draw函数。但是C#告诉我类型“object”没有这个函数。有没有关于低n00b的想法?应该在接口中定义Draw方法: public interface IDrawable { void Draw(); } 所有其他类(使用.Draw方法)都应该实现此接口。您的列表应该是列表。然后,您只需按预期对每个项目调用.Draw方法即可: List<IDrawable

基本上,我有一个包含不同类型对象的arraylist,这些对象都有一个Draw()函数。我想使用一个循环来运行每个对象的draw函数。但是C#告诉我类型“object”没有这个函数。有没有关于低n00b的想法?

应该在接口中定义
Draw
方法:

public interface IDrawable 
{
    void Draw();
}
所有其他类(使用
.Draw
方法)都应该实现此接口。您的列表应该是
列表
。然后,您只需按预期对每个项目调用
.Draw
方法即可:

List<IDrawable> list = new ...;
foreach (var item in list) 
{
    item.Draw();
}
<代码>列表=新建。。。; foreach(列表中的变量项) { item.Draw(); }
应在接口中定义
绘制方法:

public interface IDrawable 
{
    void Draw();
}
所有其他类(使用
.Draw
方法)都应该实现此接口。您的列表应该是
列表
。然后,您只需按预期对每个项目调用
.Draw
方法即可:

List<IDrawable> list = new ...;
foreach (var item in list) 
{
    item.Draw();
}
<代码>列表=新建。。。; foreach(列表中的变量项) { item.Draw(); }
它们都应该实现IDrawable接口。而且您的arraylist可能希望包含IDrawable而不是object的列表。

它们都应该实现IDrawable接口。而且您的arraylist可能希望包含IDrawable而不是object的列表。

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

如果您谈论的是UI元素,那么它们都应该实现
IDrawable
接口。如果它们是您的自定义类型,您也应该在这些类上实现
idravable
接口。然后,您可以使用通用的
列表
来存储它们

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

// Fill the list

// Iterate over each object and call Draw()
foreach(IDrawable obj in objects)
{
    obj.Draw();
}
List objects=newlist();
//填写清单
//迭代每个对象并调用Draw()
foreach(对象中的IDravable对象)
{
obj.Draw();
}

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

如果您谈论的是UI元素,那么它们都应该实现
IDrawable
接口。如果它们是您的自定义类型,您也应该在这些类上实现
idravable
接口。然后,您可以使用通用的
列表
来存储它们

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

// Fill the list

// Iterate over each object and call Draw()
foreach(IDrawable obj in objects)
{
    obj.Draw();
}
List objects=newlist();
//填写清单
//迭代每个对象并调用Draw()
foreach(对象中的IDravable对象)
{
obj.Draw();
}

如果它们共享一个公共接口,您可以将其转换为该接口

如果类型的数量已知且固定,请尝试使用运算符强制转换到每个已知类型

否则你将不得不求助于思考,类似这样的事情

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

但是,如果您需要求助于反射,这是一种巨大的代码气味,应该避免使用。

如果它们共享一个公共接口,您可以转换到该接口

如果类型的数量已知且固定,请尝试使用运算符强制转换到每个已知类型

否则你将不得不求助于思考,类似这样的事情

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

但是,如果您需要求助于反射,这是一种巨大的代码气味,应该避免使用。

使用
数组列表
所有元素都存储为类型
对象
。要调用在antother类型上定义的函数,首先需要将成员强制转换为该类型

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

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

使用
数组列表
时,所有元素都存储为类型
对象
。要调用在antother类型上定义的函数,首先需要将成员强制转换为该类型

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

for (int i = 0; i < arrayList.Count; i++) {
  MyType current = (MyType)arrayList[i];
  current.Draw();
}
如果您使用的是C#4或更高版本,则可以使用动态类型:

foreach (dynamic obj in arrayList)
    obj.Draw();
如果对象的类型缺少匹配的
Draw()

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

话虽如此,您真的不应该使用
ArrayList
,除非您被迫使用某些遗留库。正如其他人所建议的那样,更惯用的解决方案是使用
idravable
界面和
列表

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

foreach (dynamic obj in arrayList)
    obj.Draw();
如果对象的类型缺少匹配的
Draw()

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


话虽如此,您真的不应该使用
ArrayList
,除非您被迫使用某些遗留库。正如其他人所建议的,更惯用的解决方案是使用一个
idravable
接口和一个
List

使用一个自.NET 2以来就可用的通用集合。使用一个自.NET 2以来就可用的通用集合。在任何情况下,这个解决方案都不应该是一个人的首选。@KirkWoll我不同意。如果我无法控制arrayList或其内容类型(例如,如果这些内容是通过调用旧库返回的),我会使用此解决方案。我还没有遇到过使用第三方库迫使我放弃类型安全性的情况。在不放弃静态类型系统的情况下,有很多方法可以解决这类问题。无论如何,我们几乎没有异议——我说过这不应该是你的第一选择,就像,如果你能控制代码的话。@KirkWoll correct;我大体上同意。我不同意的部分是“在任何情况下”。诚然,这些都是我从未遇到过的情况,但我从事的项目中遇到这些情况并不令人惊讶。在任何情况下,这种解决方案都不应成为人们的首选。@KirkWoll我不同意。如果我无法控制arrayList或其内容类型(例如,如果这些内容是通过调用旧库返回的),我会使用此解决方案。我还没有遇到过使用第三方库迫使我放弃类型安全性的情况。在不放弃静态类型系统的情况下,有很多方法可以解决这类问题。在里面