3 Stimmen

Wie speichern Sie einen Verweis auf eine Eigenschaft in C#?

Ich bin dabei, ein Spiel zu entwickeln, und arbeite derzeit an einem Inventarsystem. Ich habe eine Klasse, die den Spieler repräsentiert, die wie folgt aussieht:

class Player {
    public Weapon WeaponSlot {get;set;}
    public Shield ShieldSlot {get;set;}
    //etc.
}

Waffen, Schilde usw. sind Unterklassen einer allgemeinen Gegenstandsklasse:

class Item {
    //...
}

class Weapon : Item {
    //...
}

Es gibt Unterklassen von Weapon, usw., aber das ist nicht wichtig.

Wie auch immer, ich erstelle ein UserControl, um den Inhalt eines bestimmten Inventarplatzes anzuzeigen/zu ändern. Ich bin mir aber nicht sicher, wie ich das genau machen soll. In C++, würde ich etwas wie verwenden:

new InventorySlot(&(player.WeaponSlot));

Aber das kann ich in C# nicht tun.

Ich habe die TypedReference-Struktur gefunden, aber das funktioniert nicht, da es nicht erlaubt ist, ein Feld mit einer dieser Strukturen zu erstellen, sodass ich es nicht zur späteren Verwendung im Steuerelement speichern kann.

Ist die Reflexion der einzige Weg, oder gibt es eine andere Möglichkeit, die ich nicht kenne?

EDIT ----

Als Referenz habe ich Folgendes getan:

partial class InventorySlot : UserControl {
    PropertyInfo slot;
    object target;

    public InventorySlot(object target, string field) {

        slot = target.GetType().GetProperty(field);

        if (!slot.PropertyType.IsSubclassOf(typeof(Item)) && !slot.PropertyType.Equals(typeof(Item))) throw new //omitted for berevity

        this.target = target;

        InitializeComponent();
    }
    //...
}

Und so wird es initialisiert:

new InventorySlot(player, "WeaponSlot");

Auch was die Leistung angeht, mache ich mir keine allzu großen Sorgen. Es ist kein Echtzeitspiel, also muss ich den Bildschirm nur in Reaktion auf die Aktionen der Spieler aktualisieren :)

4voto

heisenberg Punkte 9423

Ich erstelle ein UserControl, um den Inhalt eines bestimmten Inventarplatzes anzuzeigen/zu ändern Inventarplatzes. Ich bin mir jedoch nicht sicher wie man das genau macht. In C++, ich würde ich etwas verwenden wie

Es funktioniert standardmäßig so, wie Sie es wünschen. Das Schlüsselwort "ref" ist ebenfalls nicht erforderlich.

3voto

Tergiver Punkte 13761

Im Wesentlichen ist das, was Sie erstellen, ein Eigenschaftsbrowser. Werfen Sie einen Blick auf Windows Forms' PropertyGrid Kontrolle (lesen Sie die Dokumentation, um zu sehen, wie es funktioniert und/oder verwenden Sie Reflector, um den Code zu lesen).

Die kurze Antwort ist, einfach die Reflexion zu nutzen. Durch das Speichern eines PropertyDescriptor können Sie den Wert des Eigenschaftselements anhand der Objektinstanz abrufen und festlegen.

1voto

marvelous marv Punkte 21

Dies ist afaik das Standardverhalten

0voto

Brian R. Bondy Punkte 325712

Alle class Typ Objekt ist eine Referenz in c#. Wertetypen werden deklariert mit struct .

So zum Beispiel:

Weapon w1 = new Weapon();
w2 = w1;//Does not make a copy just makes a second reference to what w1 is pointing to

Wenn Sie einen Eingabe-/Ausgabeparameter für eine Funktion benötigen, können Sie ref . Wenn Sie einen Ausgabeparameter benötigen, können Sie out . Wenn Sie nur einen Verweis auf ein Objekt vom Typ class dann können Sie es einfach übergeben und das Klassenobjekt selbst ändern.

0voto

oekstrem Punkte 467

Sie können das Objekt klonen, um zu erreichen, was Sie wollen:

public class Weapon : ICloneable
{
    public string Name;

    object ICloneable.Clone()
    {
        return this.Clone();
    }
    public Weapon Clone()
    {
        return (Weapon)this.MemberwiseClone();
    }
}

Sie können dann etwa so vorgehen, um eine Kopie dieses Objekts mit allen internen Werten zu erhalten:

Weapon w1 = new Weapon();
Weapon w2 = w1.Clone()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X