C# 是否运行arraylist中包含的对象的成员函数?
基本上,我有一个包含不同类型对象的arraylist,这些对象都有一个Draw()函数。我想使用一个循环来运行每个对象的draw函数。但是C#告诉我类型“object”没有这个函数。有没有关于低n00b的想法?应该在接口中定义C# 是否运行arraylist中包含的对象的成员函数?,c#,C#,基本上,我有一个包含不同类型对象的arraylist,这些对象都有一个Draw()函数。我想使用一个循环来运行每个对象的draw函数。但是C#告诉我类型“object”没有这个函数。有没有关于低n00b的想法?应该在接口中定义Draw方法: public interface IDrawable { void Draw(); } 所有其他类(使用.Draw方法)都应该实现此接口。您的列表应该是列表。然后,您只需按预期对每个项目调用.Draw方法即可: List<IDrawable
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或其内容类型(例如,如果这些内容是通过调用旧库返回的),我会使用此解决方案。我还没有遇到过使用第三方库迫使我放弃类型安全性的情况。在不放弃静态类型系统的情况下,有很多方法可以解决这类问题。在里面