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



跳到问题的第三段。

上下文:我正在创建一个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)编码的。

侧面思考

我想我的第一个问题是为什么不将数组存储在列表中。那么,与其使用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替换为您试图从中获取属性值的任何实例。

对我来说,显而易见的是,代码被不必要地混淆了,看起来非常像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);
}
}

相关内容

  • 没有找到相关文章

最新更新