C#,如何使用一个字符串,而不是一个字符串,但作为另一个类中的对象的名称?

时间:2019-02-25 17:44:45

标签: c# string class object

已经搜索了其他问题,但尚未找到如何在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循环,我必须为每个对象输入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);
}

很显然,第一个代码的第二部分不起作用(strainString.cost),因为trainString是一个字符串,而不是StrainsManager类的对象。上面的for循环是否可能,或者我必须手动为这7个对象键入35行吗?

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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实现,因为我不确定100%如何运行(尽管我有一个合理的猜测)。希望这是很简单的选择。

答案 2 :(得分: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);
    }
};