跳到问题的第三段。
上下文:我正在创建一个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);
}
}