我正在創建一個遊戲,目前正在爲它的庫存系統工作。我有一個類來代表玩家,它看起來像這樣:如何在C#中存儲對屬性的引用?
class Player {
public Weapon WeaponSlot {get;set;}
public Shield ShieldSlot {get;set;}
//etc.
}
武器,盾牌等都是通用產品類的子類:
class Item {
//...
}
class Weapon : Item {
//...
}
有武器等的子類,但這並不重要。
無論如何,我創建一個用戶控件來顯示/修改一個給定的廣告位的內容。但是,我不確定如何做到這一點。在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");
此外,關於性能,我對此不太在意。這不是一個實時遊戲,所以我只需要更新屏幕以迴應玩家的操作。 :)
只是爲了澄清,我有兩個要求: 1.對象,其屬性我想修改有幾個屬性,其名稱是不知道的控制 2.可能有多個不同類別的這樣的對象我想修改。因此,我不能僅僅存儲對象的引用,因爲我無法在運行時間中對其類型進行神聖的描述。 到目前爲止,我正在使用反射,這似乎是要走的路。 – 2010-07-16 18:19:26
閱讀您的評論事實上,您不知道您需要完全做什麼,除非在運行時讓您唯一的選擇是反思。由於這是一款遊戲,因此您需要確保積極緩存反射調用(我建議您查看靜態只讀ConcurrentDictionary,甚至將此數據保存到磁盤或文檔數據庫等)。 – 2010-07-16 18:24:36
在這種情況下,性能不是問題。如果是這樣,我不會使用WinForms :) – 2010-07-16 18:29:32