2015-12-15 36 views
4

我在使用反射的TreeListView(通過ObjectListView)顯示一個類。 TreeListView與ChildrenGetter()代表一起使用,該代表獲取要顯示的節點(請參閱here)。間接更改類參數

爲了顯示類(我們稱之爲反映類),樹的根是類的一個實例,以及ChildrenGetter(object x)使用反射返回實例的每個孩子的反映的階級。

例如,對於這個類:

public class Folder 
{ 
    public int BuildNumber { get; set; } 
    public int MaxSpeed { get; set; } 
} 

根將是文件夾的一個實例,並且將有2個孩子節點,含有BuildNumber和MAXSPEED的值。

這工作正常,但只用於顯示。我希望能夠在UI上更改BuildNumber和MaxSpeed的值,以便它們實際上會更改樹根所擁有的反射類的實例。

所以有這樣做的方法有兩種:然後利用反射找到

  1. 保存父樹節點每個節點(擁有類),並創建一個「地址路徑」爲每一個節點,更改節點並實際更改它(反映的類實例中)
  2. 而不是包含反射類參數值的樹節點,它們可以包含某種指向反射類實例中參數的指針。

解決方案2甚至有可能嗎?在C#中是否存在一些可能允許此類功能的指針?

你能想出更好的解決方案嗎?

注:

  • 樹可以具有包含其它類的類,和深度沒有限制。現在,我沒有在任何地方使用結構體
  • 我無法更改反射類。這是自動生成的
  • 安全的代碼是首選,但如果沒有其他可用不安全的代碼會做
+0

就可以把'行動'它,因此您可以執行,作爲二傳手爲屬性? –

+0

是的,但動作將如何知道要更改哪個參數? – Nitay

+1

如果可以,請將一個操作'val => instance.X = val'附加到標籤或其他東西上。 –

回答

1

如果你能一些元數據附加到你創建控件/樹中的項目,您可以創建一個Action<T>和將其分配給標籤或類似的東西。

如果你有它的實例,可以使這樣的事情(使用string作爲樣本數據類型):

Action<string> action = val => instance.X = val;