如何在C#中的单个数组中添加不同类型的对象?

我打算用C#重写我的Python Tile Engine。 它使用所有游戏对象的列表并在屏幕上呈现它们。 我的问题是,与Python不同,你可以在数组中添加几乎任何东西(例如x = [“jj”,1,2.3,’G’,foo])你只能在C#数组中添加一种类型的对象(int [] x = {1,2,3};)。 是否有任何动态数组(类似于ArrayList()类)或允许您将不同类型打包到单个数组中的东西? 因为所有游戏对象都是单独的类。

非常简单 – 创建一个Object类数组并为数组赋值。

Object[] ArrayOfObjects = new Object[] {1,"3"} 

您可以编写一个名为GameObject的抽象基类,并使所有gameObjectinheritance它。

编辑:

 public abstract class GameObject { public GameObject(); } public class TileStuff : GameObject { public TileStuff() { } } public class MoreTileStuff : GameObject { public MoreTileStuff() { } } public class Game { static void Main(string[] args) { GameObject[] arr = new GameObject[2]; arr[0] = new TileStuff(); arr[1] = new MoreTileStuff(); } } 

你可以使用一个object数组。 stringsintboolclasses都被认为是对象,但确实意识到每个对象都不会保留曾经的对象,所以你需要知道一个对象实际上是一个字符串,或者某个类。 然后,您可以将对象强制转换为该类/数据类型。

例:

 List stuff = new List(); stuff.add("test"); stuff.add(35); Console.WriteLine((string)stuff[0]); Console.WriteLine((int)stuff[1]); 

虽然,C#是一种强类型语言,所以我建议你接受语言的差异。 也许您应该看看如何重构引擎以使用强类型,或者查看其他方法来共享不同的类等等。我个人喜欢C#这样做的方式,节省了我很多时间而不必担心数据类型等因为C#会在运行之前将我的代码中的任何转换(将一种数据类型更改为另一种数据类型)抛出。

另外,你不知道,xna是C#的游戏框架(没有它作为标签,所以我假设你没有使用它)。

C#有一个ArrayList,允许你在一个数组中混合类型,或者你可以使用一个对象数组,object []:

  var sr = new ArrayList() { 1, 2, "foo", 3.0 }; var sr2 = new object[] { 1, 2, "foo", 3.0 }; 

在c#中,我们使用object []数组在每个元素位置存储不同类型的数据。

  object[] array1 = new object[5]; // // - Put an empty object in the object array. // - Put various object types in the array. // - Put string literal in the array. // - Put an integer constant in the array. // - Put the null literal in the array. // array1[0] = new object(); array1[1] = new StringBuilder("Initialized"); array1[2] = "String literal"; array1[3] = 3; array1[4] = null; 

您可以使用object[] (对象数组),但使用List会更灵活。 它满足了你的要求,可以添加任何类型的对象,并且像数组一样,它可以通过数字索引访问。

使用List的优点是您不需要知道创建它时它将保留的项目。 它可以动态增长和缩小。 此外,它还有一个更丰富的API来处理它包含的项目。

这是你如何做到的

使用List (因为所有内容都是从C#中的对象派生的):

 var list = new List(); list.Add(123); list.Add("Hello World"); 

dynamic也可能适合你(和你的python背景)

 var list = new List(); list.Add(123); list.Add(new { Name = "Lorem Ipsum" }); 

如果你不想使用dynamic你真的需要知道你在做什么。 请在开始之前阅读此MSDN文章 。

但你需要它吗?

C#是一种强类型且非常可靠的编程语言。 它非常灵活,非常适合使用面向对象和function范例构建应用程序。 你想做的事情对于python来说可能是可以接受的,但在C#上看起来很糟糕。 我的建议是:使用面向对象的编程并尝试为您的问题构建模型。 永远不要像你试过的那样混合类型。 一个列表用于单个数据类型。 您想深入描述您的问题,以便我们建议您提供更好的解决方案吗?

您必须使用数据类型object声明您的数组:

 object[] myArray = { }; myArray[0] = false; myArray[1] = 1; myArray[2] = "test"; 

您可以使用对象类数组,并尽可能在数组中添加不同类型的对象。

 object[] array = new object[3]; array[0] = 1; array[1] = "string"; array[3] = 183.54;