2017-06-13 5 views
0

Ich habe diese Klassen:eine Liste von einer anderen Klasse

class Game 
    { 
     public List<Participant> Participants = new List<Participant>(); 
    } 

class Participant 
    { 
     public int ChampionId { get; set; } 
     public string SummonerName { get; set; } 
     public int SummonerId { get; set; } 
    } 

public class APICalls 
    { 
     //private Game game; 

     private string GetResponse(string url) 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

      WebResponse response = request.GetResponse(); 

      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
       return reader.ReadToEnd(); 
      } 
     } 

     public void GetParticipants() 
     { 
      // create a string from the JSON output 
      var jsonString = GetResponse("https://euw1.api.riotgames.com/lol/league/v3/positions/by-summoner/27528610?api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 

      // fill the Participants list from the Game class with participants based on the contents of the jsonString variable 
      Game.Participants = JsonConvert.DeserializeObject<Game>(jsonString); 


     } 

    } 

Ich mag meine Teilnehmerliste in der Spielklasse mit der getParticipants Methode in der Klasse APICalls füllen. Mein Problem ist, dass ich nicht von dieser Klasse auf die Liste zugreifen kann.

Ich möchte meinen gesamten API-Code in einer Klassendatei behalten, weshalb ich diese Klasse gemacht habe.

Was mache ich falsch?

+0

Sie können das nicht tun, weil Sie keine Instanz Ihrer 'Game' Klasse haben. Kann es immer nur ein "Spiel" geben? dann könntest du 'Game' vielleicht einen so genannten Singleton machen. –

+0

Ich würde vorschlagen, einen Rückgabetyp für Ihre Funktionen, z. 'public Liste GetParticipants()', auf diese Weise können Sie eine Instanz von 'APICalls' wo immer Sie wollen, und verwenden Sie' GetParticipants(); 'Methode, um Werte manuell zuzuweisen. –

Antwort

2

Entweder ein Objekt von Game erstellen und beziehen sich auf Participantsgame.Participants wie unten gezeigt:

Game game = new Game(); 
game.Participants = JsonConvert.DeserializeObject<Game>(jsonString); 

Oder

Sprechen Sie die Teilnehmerliste statisch:

class Game 
{ 
    public static List<Participant> Participants = new List<Participant>(); 
} 

und Zugriff auf die Participants Liste es direkt dann mit Game.Participants

+0

Ich werde nur 1 Spiel verwenden, wenn das Programm läuft, bis es wieder stoppt. Würden Sie in diesem Fall empfehlen, die Teilnehmerliste statisch zu machen? Im Moment neige ich dazu. – FastCow

+0

Ya. Sie können es statisch machen. Wie Tim Schmelter sagte, wenn Sie mehrere Threads haben, könnten Sie auf Probleme stoßen. – Abhishek

3

Sie müssen eine Instanz der Klasse Game, um es zu benutzen ist (nicht statisch) Felder:

var game = new Game(); 
game.Participants = JsonConvert.DeserializeObject<Game>(jsonString); 

Wenn Sie nur eine Instanz wollen könnten Sie das Feld machen static, dann der Code funktioniert. Beachten Sie jedoch, dass Sie möglicherweise Probleme bekommen, wenn mehrere Threads gleichzeitig auf diese Liste zugreifen.

1

Teilnehmer ist keine statische Eigenschaft. Sie müssen eine Instanz der Klasse deklarieren. Sie scheinen auch zu versuchen, das JSON zu einem "Spiel" -Objekt zu deserialisieren, aber dann der Eigenschaft "Teilnehmer" zuzuweisen. Ich habe angenommen, dass der JSON tatsächlich eine Teilnehmerliste zurückgibt und entsprechend angepasst wird, aber das ist vielleicht nicht der Fall.

Game game = new Game(); 
game.Participants = JsonConvert.DeserializeObject<List<Participant>>(jsonString); 
+0

Ja, der JSON gibt eine Teilnehmerliste zurück. – FastCow

+0

ok, versuchen Sie, es so zu deserialisieren, wie ich es vorgeschlagen habe. Der Versuch, eine Liste in ein einzelnes Objekt eines anderen Typs zu deserialisieren, funktioniert wahrscheinlich nicht. – ADyson

Verwandte Themen