Как я могу добавить объект в коллекцию, не зная его типа? - PullRequest
1 голос
/ 04 марта 2012

Я добавил «консоль» в свою игру, в которой я могу набирать команды и получать ответ (он основан на this ).Мне нужно иметь доступ к объектам, которые я создаю в своем Game.cs в своем классе консоли.Я не могу передать их конструктору, так как не знаю, сколько будет после того, как «двигатель» будет сделан.

Я пытался использовать метод для добавления объектов в Dictionnary<string, object>, но не могу получить доступ к свойствам.

Что бы я хотел сделать:

Game1.cs

TileMap tileMap = new TileMap();
BakuConsole console;

...

console = new BakuConsole(this, Content.Load<SpriteFont>("ConsoleFont"));
console.AddRef("tileMap", tileMap);

BakuConsole.cs

public void AddRef(/* some args */) {
   // halp!
}

public void Execute(string input) {
    switch (input)
    {
        case "some --command":
            console.WriteLine(g.ToString());
            // execute stuff, with an object that was added via AddRef()
            console.WriteLine("");
            console.Prompt(prompt, Execute);
            break;
        default:
            console.WriteLine("> " + input + " is not a valid command.");
            console.WriteLine("");
            console.Prompt(prompt, Execute);
            break;
    }
}

Надеюсь, я достаточно ясен.Спасибо!

Редактировать: Я просто не хочу, чтобы мой конструктор стал слишком большим, если я добавлю больше типов:

TileMap tileMap = new TileMap();
OtherType1 ot1 = new OtherType1();
OtherType2 ot2 = new OtherType2();
OtherType3 ot3 = new OtherType3();
OtherType4 ot4 = new OtherType4();
OtherType5 ot5 = new OtherType5();

IronPython делает именно то, что я хочу, и делает это через Globals.Add ("string", object "). Однако я не могу найти его в исходном коде (IronPython).

Ответы [ 3 ]

0 голосов
/ 04 марта 2012

Вам необходимо указать имя класса в словаре того объекта, который вы собираетесь добавить в словарь. Предположим, мне пришлось добавить объекты "Game1", тогда мы должны инициализировать словарь следующим образом ...

Dictionary<string, Game1> dicDemo = new Dictionary<string, Game1>();
Game1 objgame1 = new Game1();
dicDemo.Add(string.Empty,objgame1);
0 голосов
/ 05 марта 2012

Из того, что вы описали, на самом деле вам не нужен словарь, вам нужно несколько свойств для какого-либо объекта, возможно, непосредственно для BakuConsole;

class BakuConsole
{
    … // your current code here

    public TileMap TileMap { get; set; }
    public OtherType1 OtherType1 { get; set; }
    …
}

Затем вы можете установить его так:

console.TileMap = tileMap;
console.OtherType1 = otherType1;
…

И тогда, когда вы используете его, у вас не будет никаких проблем с доступом к свойствам.

0 голосов
/ 04 марта 2012

Я вижу, что вы передаете ссылку Game в класс Console. Почему вы не используете эту ссылку, чтобы получить доступ к тому, что вам нужно из класса Game?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...