2016-11-09 1 views
1

Ich habe zwei Klassen. Ein Spieler der Klasse, die die Eigenschaften Name, Gleichgewicht und Karten hat:C# Wie verwende ich die Eigenschaft eines instanzierten Objekts (eine Liste) in einer Funktion?

class Player 
{ 
    public string Name; 
    public decimal Balance; 
    public List<Card> Cards; // My question is related to this property 
} 

und eine Karte Klasse:

class Card 
{ 
    public string Name; 
    public int Attack; 
    public int Defense; 
    public decimal Cost; 
} 

ich ein Objekt für den Spieler instanziiert:

var player = new Player("Ahmad", 100); 

und auch eine Karte:

var card = new Card("Mino", 3, 3, 200); 

hinzugefügt dann die Karte des Spielers Karten:

player.Cards[0] = card; 

Ich kann es einfach auf der Hauptmethode anzuzeigen, in dem es instanziiert wurde, aber das Problem ist: Wie kann ich die Karten des Spielers in einer Funktion zugreifen? etwa so:

///<summary> 
/// Function to show current cards 
/// </summary> 
public static void ViewCards(object player) 
{ 
    var cards = player.Cards // This line doesn't work 
    foreach (var card in cards) 
    { 
     Console.WriteLine($"{card.Name}"); 
     Console.WriteLine($"Attack: {card.Attack}"); 
     Console.WriteLine($"Defense: {card.Defense}"); 
     Console.WriteLine($"Cost: ${card.Cost}"); 
    }  
} 

Antwort

5

ändern Sie die Methodensignatur die Spieler Parameter ändern, von Object zu Player

public static void ViewCards(Player player) 
{ 
} 
2

Wenn Sie einen OO Ansatz beibehalten wollen, dass es ein Verfahren auf dem Player machen könnte.

class Player 
{ 
    public string Name {get;set;} 
    public decimal Balance {get;set;} 
    public List<Card> Cards {get;set;} 

    public void ViewCards() 
    { 
     foreach (var card in Cards) 
     { 
      Console.WriteLine($"{card.Name}"); 
      Console.WriteLine($"Attack: {card.Attack}"); 
      Console.WriteLine($"Defense: {card.Defense}"); 
      Console.WriteLine($"Cost: ${card.Cost}"); 
     }  
    } 
} 

Und dann auf irgendeine Methode

player.ViewCards(); 

Auch sollten Sie nicht öffentliche Felder verwenden, anstatt eine Eigenschaft verwenden. Dies fördert eine bessere Verkapselung und Klassenkohäsion. Ich beziehe mich hier auf Name, Balance und Cards. Die get; und erstellen ein Backing-Feld während der Kompilierungszeit.

+0

Ich liebe Ihren Vorschlag. Danke, ich schätze es sehr. –

+0

@AhmadAbdullahAwayhan - kein Problem. Wenn Sie es mögen, denken Sie bitte daran zu upvote (anders als das Markieren als Antwort, da Sie mehrere Antworten aufwerten können). Sie tun dies mit dem Pfeil nach oben neben einer Antwort. – Igor

1

Sie müssen das Objekt zu Klasse-Spieler

///<summary> 
/// Function to show current cards 
/// </summary> 
public static void ViewCards(object player) 
{ 
    var cards = (player as Player)?.Cards; // cast object to Player, returs null if object is not of correct type 

    if (cards != null) 
    { 
     foreach (var card in cards) 
     { 
      Console.WriteLine($"{card.Name}"); 
      Console.WriteLine($"Attack: {card.Attack}"); 
      Console.WriteLine($"Defense: {card.Defense}"); 
      Console.WriteLine($"Cost: ${card.Cost}"); 
     } 
    }  
} 
0

werfen Wenn Sie nicht wollen, Objekttyp angeben, können Sie dynamische verwenden

public static void ViewCards(dynamic player) 
{ 
    var cards = player.Cards // This line doesn't work 
    foreach (var card in cards) 
    { 
     Console.WriteLine($"{card.Name}"); 
     Console.WriteLine($"Attack: {card.Attack}"); 
     Console.WriteLine($"Defense: {card.Defense}"); 
     Console.WriteLine($"Cost: ${card.Cost}"); 
    }  
} 

Sie können aber eine Ausnahme zur Laufzeit haben wenn Ihr Objekt keine Eigenschaft hat Karten

Verwandte Themen