How to add different types of objects in a single

2020-02-20 07:28发布

问题:

I am planning to rewrite my Python Tile Engine in C#. It uses a list of all the game objects and renders them on the screen. My problem is that unlike in Python where you can add almost anything to an array (e.g x = ["jj" , 1, 2.3, 'G', foo]) you can add only one type of objects in a C# array (int[] x = {1,2,3};) . Are there any dynamic arrays (similar to the ArrayList() class) or something which allows you to pack different types into a single array? because all the game objects are individual classes.

回答1:

Very simple—create an array of Object class and assign anything to the array.

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


回答2:

you can use an object array. strings, int, bool, and classes are all considered objects, but do realize that each object doesn't preserve what it once was, so you need to know that an object is actually a string, or a certain class. Then you can just cast the object into that class/data type.

Example:

List<object> stuff = new List<object>();

stuff.add("test");
stuff.add(35);

Console.WriteLine((string)stuff[0]);
Console.WriteLine((int)stuff[1]);

Though, C# is a strongly typed language, so I would recommend you embrace the language's differences. Maybe you should look at how you can refactor your engine to use strong typing, or look into other means to share the different classes, etc. I personally love the way C# does this, saves me a lot of time from having to worry about data types, etc. because C# will throw any casting (changing one data type to another) errors I have in my code before runtime.

Also, encase you didn't know, xna is C#'s game framework (didn't have it as a tag, so I assume you aren't using it).



回答3:

You can write an abstract base class called GameObject, and make all gameObject Inherit it.

Edit:

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();
    }
}


回答4:

C# has an ArrayList that allows you to mix types within an array, or you can use an object array, object[]:

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


回答5:

In c# we use an object[] array to store different types of data in each element location.

  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;


回答6:

You can use object[] (an object array), but it would be more flexible to use List<object>. It satisfies your requirement that any kind of object can be added to it, and like an array, it can be accessed through a numeric index.

The advantage of using a List is you don't need to know how items it will hold when you create it. It can grow and shrink dynamically. Also, it has a richer API for manipulating the items it contains.



回答7:

Here is how you can do it

Use List<object> (as everything is derived from object in C#):

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

Also dynamic might work for you (and your python background)

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

If you wan't to use dynamic you really need to know what you're doing. Please read this MSDN article before you start.

But do you need it?

C# is a strongly-typed and very solid programming language. It is very flexible and great for building apps using object-oriented and functional paradigms. What you want to do may be acceptable for python, but looks pretty bad on C#. My recommendation is: use object oriented programming and try to build model for your problem. Never mix types together like you tried. One list is for a single data-type. Would you like to describe your problem in depth so that we can suggest you a better solution?



回答8:

You have to declare your array with the datatype object:

object[] myArray = { };

myArray[0] = false;
myArray[1] = 1;
myArray[2] = "test";


回答9:

You can use an array of object class and all it possible to add different types of object in array.

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


标签: c# .net arrays