2016-06-06 9 views
0

Springe zum dritten Absatz für die Frage.Wie kann ich den Wert eines Elements in einem Array über Reflektion erhalten

Kontext: Ich erstelle ein 2D-Raumschiffspiel, und eine der Spielmechaniken ist es, die 7 verschiedenen Teile des Schiffes an die aktuelle Situation anzupassen. Es gibt Voreinstellungen, die Sie können jederzeit zu Power Configurations wechseln. Ich habe die Macht Konfigurationen in 3 verschiedenen Arrays gespeichert, etwa so:

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

Wenn Sie Konfigurationen wechseln, ist es eine Methode aufruft, so zu tun. Die Methode führt einige Berechnungen durch, um zu bestimmen, wie lange es dauern wird, um Konfigurationen zu wechseln. Anstatt jedoch eine switch-Anweisung zu erstellen und den Code mehrmals zu kopieren/einfügen, wenn der Spieler zu einer der drei Konfigurationen wechselt, möchte ich PropertyInfo in System.Reflections verwenden, um auszuwählen, von welcher Eigenschaft ich Werte abrufen muss.

Frage: Das Problem ist, dass ich nicht weiß, wie man ein Element von einem Array bekommt. Hier ist, was ich bisher habe, wo ich versuche zu bestimmen, wie viel Energie insgesamt umgeleitet werden muss und alles zu einer Variablen hinzufügen muss. 0 ist der Index in der Konfiguration, bei der ich entschieden habe, die Schirmleistung zu speichern. PowerToShields ist die aktuelle Energie, die zu den Shields geleitet wird.

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

Könnte jemand bitte erklären, was ich falsch mache und/oder mir zeigen, wie ich es beheben kann? Oder gibt es einen besseren Weg, dies zu tun?

EDIT 1: Dies ist in C# (Unity) codiert.

+0

geposteten Code sieht aus wie C# -Code, bestätigen Sie bitte, dass es – stackuser83

+0

Ja, es ist C# . Gibt es eine Option, die ich irgendwo ankreuzen kann, die Leser sagt, dass es C# ist oder sagst du, dass ich irgendwo in der Post sagen sollte, dass es C# ist? –

+0

sieht aus wie du hast es, es ist markiert C# jetzt – stackuser83

Antwort

2

Side dachte

ich meine erste Frage erraten ist, warum nicht die Arrays in einer Liste speichern. Anstatt also powerConfiguration1, powerConfiguration2, powerConfiguration3, warum speichern nicht nur eine Liste von int [], so

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

diese Weise können Sie das Einzelteil erhalten über:

powerToReroute = (powerConfigurationList[number])[0] 

Antwort auf Ihre Frage

jedoch davon aus, dass es einige gute Gründe, die Sie nicht können, und um Ihre genaue Frage, gehen Sie wie folgt zu beantworten:

... 
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]); 

Von Ihrem Code-Snippet, sehe ich Sie haben GetType().GetProperty("powerConfiguration" + number);. Ich bin nicht sicher, was die tatsächliche Instanz ist, dass Sie diesen Typ von bekommen. Sie müssen daher instanceThatHasTheProperty in meinem obigen Snippet ersetzen, durch welche Instanz auch immer Sie den Wert der Eigenschaft abrufen möchten.

+0

Was ich versuchte, war herauszufinden, aus welchem ​​Array ich Werte extrahieren wollte, indem ich den Namen mit einer Zeichenfolge ("powerConfiguration") und der Nummer der Konfiguration, die der Spieler wählte (Nummer), konstruierte. Wenn also der Spieler zur Stromkonfigurationsnummer 2 wechseln wollte, dann wäre "powerConfiguration" + Nummer gleich "powerConfiguration2" und ich würde diese Zeichenfolge verwenden, die den Namen der Eigenschaft enthält, um die Eigenschaft selbst zu finden und darauf zuzugreifen ... Ich hatte einen ähnlichen Code in einem meiner anderen Projekte verwendet, also dachte ich, dass es auch hier funktionieren würde. –

+0

Das Speichern der Arrays in einer Liste klingt jedoch viel einfacher. Ich werde das versuchen und zu diesem Thread mit meinen Ergebnissen zurückkehren. –

+0

Ja. Das oben genannte gibt Ihnen zwei Möglichkeiten. Die zweite Hälfte der Antwort gibt eine Lösung, die Ihre Frage mit Ihrem gewünschten Design beantworten würde. –

0

Die Sache, die für mich sofort offensichtlich ist, ist, dass der Code unnötig verschleiert ist und sehr viel wie ein X-Y-Problem scheint. Die Verwendung von gezackten Arrays und Reflektionen scheint eine Menge Arbeit zu sein, um objektorientierte Programmierung zu beenden. Meine Empfehlung wäre, eine Klasse zu erstellen, um Ihre Stromkonfigurationen zu speichern, mehrere Stromkonfigurationen in einer Liste zu speichern und dann die Konfiguration aus der Liste auszuwählen.

Beispielklasse für Stromversorgungs-Konfigurationen

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

einfügen und Zugriff auf Ihre Netzkonfigurationen

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

Vielen Dank dafür. Ich hatte vergessen, eine andere Klasse zu verwenden, um Gruppen verwandter Variablen zu speichern. Ich habe die Idee in meinen Code integriert. –

Verwandte Themen