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 :)