2013-06-05 24 views
0

我在c#應用程序中創建了一個數據驅動的方式來創建UI元素,讓我可以調試非引用類型變量(bools,ints等) )在運行時進行調試。因爲你不能在c#中存儲引用(就像你可以通過C++傳遞一個指針一樣),正如在Storing a reference in c#中所解釋的那樣,我必須創建委託來獲取和設置我想調試的任何變量,例如:將對非引用對象的引用綁定到C#中的窗體控件上

createCheckboxSetting("Debug Bool", 
         delegate(bool newVal) { testBool = newVal; }, 
         delegate() { return testBool; }); 

我很想不用寫這個泡泡糖代碼每一次,爲了讓我的調試形式更新傳遞(通過窗體複選框的Click事件)的變量的代碼生成的控制。有沒有什麼辦法可以讓這個工作,以便我可以以下面的方式調用函數(或者比較簡單)?

createCheckboxSetting("Debug Bool", ref testBool); 

如果我試圖創建中createCheckboxSetting的代表,我得到以下錯誤:「不能使用ref或out參數‘VARIABLE_NAME’匿名方法,lambda表達式或查詢表達式中」 如果有更清晰的方法來做到這一點,我真的不知道如何,我真的很想保持這種快速和簡單的使用,原因很明顯。

我真的很感激這個幫助,因爲我仍然在習慣C#。感謝您的任何建議!

回答

0

我不能說我完全理解你的問題,但如果你想讓你的非引用類型「變量」(字段?)引用能夠,你可以把它們放在一個類中。例如,創建一個將字符串或整數常量映射到FieldBase類的字典字段,然後將該字典中所有需要的FieldBase對象存儲在該字典中,然後按名稱查找它們。 FieldBase類可以是非泛型的,派生類泛型:

abstract class FieldBase 
{ 
    public readonly string Name; 
    protected FieldBase(string name) { Name = name; } 
} 
sealed class Field<T> : FieldBase where T : struct 
{ 
    public Field(string name) : base(name) { } 
    public T Value; 
} 
+0

陷阱。感謝您的迴應!我希望能夠保留一個bool varialbe,並直接將它傳遞給一個函數,使其值可以通過複選框直接更改。在C++中,我只是將一個指向變量的指針傳遞給創建複選框的函數,並在更改時更新解除引用的指針。 任何有關我應該在問題中澄清以便更容易理解的建議也值得讚賞。 – EricTheRed

+0

雖然我們可以將對某個字段的引用傳遞給一個函數並對其進行處理,但我們無法保持該引用,因爲您會使用C++中的指針。例如,SetField (ref T field,T newValue){field = newValue; },有效,但你無法以任何方式保持領域。 –