如何通过反射获取数组中某项的值

How Can I Get The Value of an Item in an Array via Reflection

跳到问题的第三段。

上下文: 我正在创建一个 2D 宇宙飞船游戏,其中一个游戏机制是将电力分配到飞船的 7 个不同部分以适应您当前的情况'重新进入。您可以随时切换到预设,称为电源配置。我将电源配置存储在 3 个不同的数组中,如下所示:

int[] powerConfiguration1 = new int[7] {10,10,10,10,20,20,20};
int[] powerConfiguration2 = new int[7] {20,20,20,10,10,10,10};
int[] powerConfiguration3 = new int[7] {10,20,10,20,10,20,10};

当您切换配置时,它会调用一个方法来执行此操作。该方法进行一些计算以确定切换配置需要多长时间。但是,在播放器切换到三种配置中的任何一种的情况下,我不想多次制作 switch 语句和 copy/pasting 代码,而是想使用 System.Reflections 中的 PropertyInfo 来选择哪个 属性 我需要从中提取值。

问题:问题是我不知道如何从数组中获取项目。到目前为止,这是我所拥有的,我试图确定总共需要重新路由多少功率并将其全部添加到一个变量中。 0 是我决定存储护盾能量的配置中的索引。 powerToShields 是传送到防护罩的当前功率。

void switchConfiguration(int number) {
PropertyInfo powerConfiguration = GetType().GetProperty("powerConfiguration" + number);
int powerToReroute = 0;
powerToReroute += Mathf.Abs(powerToShields - powerConfiguration[0]);

谁能解释一下我做错了什么 and/or 告诉我如何解决它?或者,有更好的方法吗?

编辑 1: 这是用 C# (Unity) 编码的。

边想

我想我的第一个问题是为什么不将数组存储在列表中。所以,为什么不只存储一个 int[] 列表而不是 powerConfiguration1、powerConfiguration2、powerConfiguration3,所以

List<int[]> powerConfigurationList = new List<int[]>;
powerConfigurationList.Add(new int[7] {10,10,10,10,20,20,20});
powerConfigurationList.Add(new int[7] {20,20,20,10,10,10,10});
powerConfigurationList.Add(new int[7] {10,20,10,20,10,20,10});

这样你就可以通过以下方式获得物品:

powerToReroute = (powerConfigurationList[number])[0]

回答你的问题

但是,假设您有充分的理由不能回答您的确切问题,请执行以下操作:

...
PropertyInfo powerConfiguration = GetType().GetProperty("powerConfiguration" + number); //this line is taken from your example above

//then you need to do something like the below
var value = (int[])powerConfiguration.GetValue(instanceThatHasTheProperty);
int powerToReroute = 0;
powerToReroute += Mathf.Abs(powerToShields - value[0]);

从您的代码片段中,我看到您有 GetType().GetProperty("powerConfiguration" + number);。我不确定您从中获取该类型的实际实例是什么。因此,您需要用您尝试从中获取 属性 值的任何实例替换我上面代码段中的 instanceThatHasTheProperty

对我来说很明显的一点是,代码被不必要地混淆了,看起来非常像 X-Y 问题。使用锯齿状数组和反射似乎要完成面向对象编程的大量工作。我的建议是创建一个 class 来存储您的电源配置,将多个电源配置存储在一个列表中,然后 select 列表中的配置。

电源配置示例 Class

public class PowerConfiguration
{
    public int ID { get; set; }

    public string Name { get; set; }

    public int Shields { get; set; }

    public int Weapons { get; set; }

    public int LifeSupport { get; set; }

    public int Propulsion { get; set; }
}

插入和访问您的电源配置

public class DoStuff
{
    public void LoadPowerConfiguration()
    {
        // Create a List to store configurations
        List<PowerConfiguration> allPowerConfigurations = new List<PowerConfiguration>();

        // Add some mock data to the list
        allPowerConfigurations.Add(new PowerConfiguration()
        {
            ID = 0,
            Name = "Balanced Combat",
            Shields = 30,
            Weapons =  30,
            LifeSupport = 20,
            Propulsion = 20
        });

        allPowerConfigurations.Add(new PowerConfiguration()
        {
            ID = 1,
            Name = "Offensive",
            Shields = 20,
            Weapons = 50,
            LifeSupport = 10,
            Propulsion = 20
        });

        // Figure out which ID you what (eg. from the user pressing '0')
        int selectedConfigurationID = 0;

        // Get the configuration from the list
        PowerConfiguration selectedConfiguration =
            allPowerConfigurations.FirstOrDefault(p => p.ID == selectedConfigurationID);

        // Now perform your operations against the PowerConfiguration object's properties
        int powerToShields = 100;
        int powerToReroute = 0;

        powerToReroute += Math.Abs(powerToShields - selectedConfiguration.Shields);
    }
}