Я создаю игру и сейчас работаю над системой инвентаризации для нее. У меня есть класс для представления игрока, который выглядит следующим образом:
class Player {
public Weapon WeaponSlot {get;set;}
public Shield ShieldSlot {get;set;}
//etc.
}
Оружие, Щит и т. Д. Являются подклассами общего класса предметов:
class Item {
//...
}
class Weapon : Item {
//...
}
Есть подклассы оружия и т. Д., Но это не важно.
В любом случае, я создаю UserControl для отображения / изменения содержимого данного слота инвентаря. Тем не менее, я не уверен, как именно это сделать. В C ++ я бы использовал что-то вроде:
new InventorySlot(&(player.WeaponSlot));
Но я не могу сделать это в C #.
Я обнаружил структуру TypedReference, но она не работает, поскольку вам не разрешено создавать поле с одной из этих структур, поэтому я не смог сохранить его для использования в дальнейшем в элементе управления.
Является ли рефлексия единственным путем, или есть какое-то другое средство, о котором я не знаю?
РЕДАКТИРОВАТЬ ----
Для справки, вот что я сделал:
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();
}
//...
}
И это инициализируется так:
new InventorySlot(player, "WeaponSlot");
Кроме того, что касается производительности, я не слишком обеспокоен этим. Это не игра в реальном времени, поэтому мне нужно только обновить экран в ответ на действия игрока. :)