C # Как я могу использовать строку для ссылки на уже существующую переменную с тем же именем? - PullRequest
1 голос
/ 28 марта 2012

У меня есть текстовый файл, и в каждой строке одно слово, за которым следуют определенные значения

Например:

texture_menu_label_1 = 0 0 512 512

Что я хочу сделать, это прочитать этот текст и в основном конвертироватьэто к следующей команде:

texture_menu_label_1 = new int[]{0, 0, 512, 512};

Разбор строки и извлечение целочисленных значений для конструктора тривиальны, но мне интересно, есть ли в любом случае использовать строку "texture_menu_label_1" из файла для ссылки на пре-существующая переменная с тем же именем ...

Есть ли способ сделать это без создания таблицы поиска вручную?

Ответы [ 4 ]

4 голосов
/ 28 марта 2012

Вы действительно не хотите этого делать.Я знаю, вы так думаете, я помню, когда я учился программировать, и я думал о том же, но на самом деле вы этого не делаете.

В вашем случае есть лучшие способы хранения значений коллекцийэто будет многомерный массив (или List<List<int>>).Если это не так, то, возможно, хеш-таблица (Dictionary<string,int[]>).

Еще лучше, если эти данные являются «регулярными» и логически связаны, создайте свой собственный тип и сохраните их коллекцию.Вы действительно не хотите идти по пути привязки вашей логики к именам ваших переменных ... очень грязно.

Эти данные выглядят как прямоугольник.Почему бы просто не поддерживать Dictionary<string,Rectangle>?

var dict = new Dictionary<string, Rectangle>();
dict.Add("some_name", new Rectangle(0, 0, 512, 512));
// ... later
var rect = dict["some_name"];  // get the rectangle that maps to "some_name"
2 голосов
/ 28 марта 2012

Прежде чем пытаться реализовать ответ, подумайте, почему вы это делаете, и может ли быть лучшее решение.

Я рекомендую использовать словарь для хранения данных по имени в виде строк.

dataDictionary["texture_menu_label_1"] = new int[] { ... };

Другой подход заключается в использовании отдельного класса с полями, поскольку к полям можно обращаться по имени.Однако могут возникнуть проблемы с производительностью, и это определенно не является оптимальным решением.

class Data
{
    public int[] texture_menu_label_1;
    ...
}

Вы можете использовать отражение, чтобы установить значение поля.Как то так:

typeof(Data).GetField("texture_menu_label_1").SetValue(data, new int [] { ... });
1 голос
/ 28 марта 2012

Используйте HashTable (словарь для обобщений) или подобное.Ключом будет строка (texture_menu_label_1), а значением будет массив.

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

Что если вы обернетесь в структуру?

struct TextureMenu
{
  string MenuString;
  int[] Values;
}

Тогда вместо того, чтобы иметь дело непосредственно с любым типом, вы просто имеете дело со структурой.

...