具體而言,我想將一個onChange事件添加到字符串類,我該怎麼做?如何使用onChange事件擴展類型
我有一個字符串字典作爲我的一個類的成員。其中一個或多個字符串可能具有需要在更改時調用的函數。該功能由使用該類的代碼定義。
如果可能的話,最簡單的方法是將字符串添加到事件處理函數中,或者創建一個從字符串繼承的新類,讓我的字典保存它們。我將如何做到這一點?
更新:
我的字典是目前的字符串,但我可以改變它,而無需太過計較INT或動態的。
具體而言,我想將一個onChange事件添加到字符串類,我該怎麼做?如何使用onChange事件擴展類型
我有一個字符串字典作爲我的一個類的成員。其中一個或多個字符串可能具有需要在更改時調用的函數。該功能由使用該類的代碼定義。
如果可能的話,最簡單的方法是將字符串添加到事件處理函數中,或者創建一個從字符串繼承的新類,讓我的字典保存它們。我將如何做到這一點?
更新:
我的字典是目前的字符串,但我可以改變它,而無需太過計較INT或動態的。
字符串是密封的。你不能從它們繼承。無論如何,它們是不可改變的,永遠不能改變。您可以做的最接近的事情是使用INotifyPropertyChanged
訂閱對象中的屬性更改。在此示例中,我創建了一個偵聽器,當Foo
中的一個屬性值發生更改時,該偵聽器得到更新。
void Main() {
var f = new Foo();
f.PropertyChanged += (sender, e) =>
Console.WriteLine ("Changed: {0}", e.PropertyName);
f.Name = "asdf";
f.Size = 123;
}
class Foo
: System.ComponentModel.INotifyPropertyChanged
{
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
private string _Name;
public string Name {
get {
return this._Name;
}
set {
if (this.PropertyChanged != null) {
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Name"));
}
this._Name = value;
}
}
private int _Size;
public int Size {
get {
return this._Size;
}
set {
if (this.PropertyChanged != null) {
this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Size"));
}
this._Size = value;
}
}
}
輸出:
Changed: Name
Changed: Size
將這樣的事件添加到字符串沒有意義,因爲字符串是不可變的。你不能改變他們的內容,只能用你想要的內容創建新的字符串。現在
,您可以通過改變什麼字符串值,它指向修改字符串變量。例如,在此代碼中:
string s = "Hello";
s = s + " there";
通過連接兩個字符串「Hello」和「there」來創建一個新字符串。然後變量s
被更新爲指向新的字符串。如果string
類有一個Changed
事件,你聽了變化對s
,像這樣:
string s = "Hello";
s.Changed += ((sender, args) => MessageBox.Show("changed!"));
s = s + " there";
的事件將永遠不會觸發,消息將永遠不會看到。這是因爲在分配s = s + " there"
時,註銷事件處理程序的字符串被丟棄。您註冊了字符串「Hello」的更改,該更改由新字符串「Hello there」取代。
您的字典有類似的情況。考慮下面的代碼,然後再使用虛擬Changed
事件:
Dictionary<string, string> dict = new Dictionary<string, string>();
dict["foo"] = "bar";
dict["foo"].Changed += ((sender, args) => MessageBox.Show("changed!"));
dict["foo"] = "the replacement string";
這裏,同樣,Changed
事件將永遠不會觸發,消息永遠不會顯示,因爲你永遠不會改變字符串「bar」的值。而是用另一個字符串「替換字符串」替換字符串「bar」。字符串「bar」被丟棄。
什麼你可以確實如其他人所說,是定義一個新類那裏獲得的數據結構必須經過自己的看門方法,你確定修改內部數據結構的情況下,並觸發一個Changed
事件因此。
我想你真正想要的是實現一個 「觀察到字典」。
什麼你可能要考慮的是實現一個IDictionary TKey, TVal(你可能只是有一個通用字典作爲後備存儲),並有Item的二傳手觸發一個事件?
這讓我的downvote回讀「我的手指滑落在我打acciden輸入」:d – Habib
它封裝在一個類,代碼添加到一個setter /更新方法和實現事件/ INotifyPropertyChanged的 –
字符串不改變,該密鑰的值是。 – LexyStardust