c #, Как использовать строку не как строку, а как имя объекта в другом классе?

2

Искал в других вопросах, но не нашел, как это сделать в С#. Пробовал использовать функцию Map, но она не доступна в С#.

Я хочу использовать цикл для ссылки на значения в объектах в классе StrainsManager:

public StrainsManager Ba2;
public StrainsManager Ba3;
public StrainsManager Ba4;
public StrainsManager Ba5;
public StrainsManager Ba6;
public StrainsManager Ba7;
public StrainsManager Ba8;

void Update()
{

    for (int i = 2; i < 9; i++)
    {
        string strainString = "Ba" + i;

        PlayerPrefs.SetFloat(strainString + "Cost", strainString.cost);
        PlayerPrefs.SetFloat(strainString + "IPSAdd", strainString.IPSAdd);
        PlayerPrefs.SetFloat(strainString + "Time", strainString.time);
        PlayerPrefs.SetFloat(strainString + "CostMod", strainString.costMod);
        PlayerPrefs.SetFloat(strainString + "InfectMod", strainString.infectMod);
    }

}

Без цикла for мне пришлось бы набирать по 5 строк на объект:

    void Update()
{
    PlayerPrefs.SetFloat("Ba2Cost", Ba2.cost);
    PlayerPrefs.SetFloat("Ba2IPSAdd", Ba2.IPSAdd);
    PlayerPrefs.SetFloat("Ba2Time", Ba2.time);
    PlayerPrefs.SetFloat("Ba2CostMod", Ba2.costMod);
    PlayerPrefs.SetFloat("Ba2InfectMod", Ba2.infectMod);
}

Очевидно, что вторая часть в первом коде не работает (straString.cost), потому что straString является строкой, а не объектом класса StrainsManager. Возможно ли приведенное выше для цикла for или мне нужно сделать это вручную, набрав 35 строк для этих 7 объектов?

  • 4
    Вы можете объявить List<StrainsManager> или StrainsManager[] вместо того, чтобы объявлять их явно. Затем просто переберите список / массив.
  • 2
    Если вы когда-нибудь обнаружите нумерацию переменных (например, Ba2 , Ba3 и т. Д.), Вы, вероятно, делаете это неправильно. Вероятно, вам следует использовать массив, список или другую структуру данных для хранения всех этих переменных. Намного легче иметь дело с Ba[n] потому что вы можете заменить переменную на n .
Показать ещё 1 комментарий
Теги:
class
string
object

3 ответа

2
Лучший ответ

Вы можете объявить List<StrainsManager> или StrainsManager[] вместо того, чтобы объявлять их явно. Затем просто переберите список/массив, обращаясь к каждому элементу по очереди.

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

public StrainsManager[] StrainsManagerArray = new StrainsManager[7];

/*
 *  Wherever you're setting Ba2-Ba8, instead set StrainsManagerArray[0-6]
 */

void Update()
{

    foreach (StrainsManager strainsManager in StrainsManagerArray)
    {
        //Access each StrainsManager here
    }

}

Я специально PlayerPrefs.SetFloat реализации PlayerPrefs.SetFloat, так как я не уверен на 100%, как это работает (хотя у меня есть честное предположение). Надеюсь, это довольно просто, куда идти отсюда, хотя.

5

Вы можете сохранить Dictionary<string, StrainsManager> чтобы сопоставить ключи "Ba #" с вашими экземплярами StrainsManager.

void Update()
{
    for (int i = 2; i < 9; i++)
    {
        string strainString = "Ba" + i;

        map[strainString].Cost = strainString.cost; //follow this pattern for the other properties.
        //PlayerPrefs.SetFloat(strainString + "IPSAdd", strainString.IPSAdd);
        //PlayerPrefs.SetFloat(strainString + "Time", strainString.time);
        //PlayerPrefs.SetFloat(strainString + "CostMod", strainString.costMod);
        //PlayerPrefs.SetFloat(strainString + "InfectMod", strainString.infectMod);
    }
}
  • 3
    Просто спрашиваю: если straString имеет строковый тип, откуда берется поле 'cost'?
  • 1
    Я представляю неполный пример в качестве ссылки на @Mohammad Nadeem в качестве сравнения с его собственным примером кода, чтобы увидеть, как внести изменения.
1

Попробуйте этот фрагмент кода:

void Update()
{
    var items = new Dictionary<string, StrainsManager>
    { 
         { nameof(Ba2), Ba2 },
         { nameof(Ba3), Ba3 },
         { nameof(Ba8), Ba8 },
    };

    foreach (var item in items)
    {
        PlayerPrefs.SetFloat($"{item.Key}Cost", item.Value.cost);
        PlayerPrefs.SetFloat($"{item.Key}IPSAdd", item.Value.IPSAdd);
        PlayerPrefs.SetFloat($"{item.Key}Time", item.Value.time);
        PlayerPrefs.SetFloat($"{item.Key}CostMod", item.Value.costMod);
        PlayerPrefs.SetFloat($"{item.Key}InfectMod", item.Value.infectMod);
    }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню