c #, Как использовать строку не как строку, а как имя объекта в другом классе? - PullRequest
0 голосов
/ 25 февраля 2019

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

Я хочу использовать цикл for для ссылки на значения в объектах в классе 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 Iпотребуется ввести 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 объектов?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы можете объявить 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, так как я не уверен на 100%, как это работает (хотя у меня есть справедливое предположение).Надеюсь, это довольно просто, куда идти отсюда.

0 голосов
/ 25 февраля 2019

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

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);
    }
};
0 голосов
/ 25 февраля 2019

Вы можете сохранить 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...