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

时间:2016-06-06 18:47:05

标签: c# arrays unity5 propertyinfo

跳到问题的第三段。

背景:我正在创建一个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语句并复制/粘贴代码,而是想在System.Reflections中使用PropertyInfo来选择从中提取值所需的属性。

问题:问题是我不知道如何从数组中获取项目。这是我到目前为止所做的,我试图确定需要多少功率重新路由并将其全部添加到变量中。 0是我决定存储屏蔽功率的配置中的索引。 powerToShields是当前被传送到屏蔽的电源。

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

有人可以解释一下我做错了什么和/或告诉我如何修复它?或者,有更好的方法吗?

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

2 个答案:

答案 0 :(得分:2)

侧面思考

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

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,无论您尝试从哪个实例获取该属性的值。

答案 1 :(得分:0)

对我来说很明显的事情是,代码不必要地被混淆,并且看起来很像X-Y问题。使用锯齿状数组和反射似乎需要进行大量的工作才能完成面向对象的编程。我的建议是创建一个类来存储您的电源配置,在列表中存储多个电源配置,然后从列表中选择配置。

电源配置的示例类

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);
    }
}