2015-05-14 29 views
-2

具體而言,我想將一個onChange事件添加到字符串類,我該怎麼做?如何使用onChange事件擴展類型

我有一個字符串字典作爲我的一個類的成員。其中一個或多個字符串可能具有需要在更改時調用的函數。該功能由使用該類的代碼定義。

如果可能的話,最簡單的方法是將字符串添加到事件處理函數中,或者創建一個從字符串繼承的新類,讓我的字典保存它們。我將如何做到這一點?

更新:

我的字典是目前的字符串,但我可以改變它,而無需太過計較INT或動態的。

+2

這讓我的downvote回讀「我的手指滑落在我打acciden輸入」:d – Habib

+2

它封裝在一個類,代碼添加到一個setter /更新方法和實現事件/ INotifyPropertyChanged的 –

+1

字符串不改變,該密鑰的值是。 – LexyStardust

回答

1

字符串是密封的。你不能從它們繼承。無論如何,它們是不可改變的,永遠不能改變。您可以做的最接近的事情是使用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 
2

將這樣的事件添加到字符串沒有意義,因爲字符串是不可變的。你不能改變他們的內容,只能用你想要的內容創建新的字符串。現在

,您可以通過改變什麼字符串值,它指向修改字符串變量。例如,在此代碼中:

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事件因此。

+0

雖然您的答案不僅僅是正確的,更多的是評論而不是答案,因爲它仍然不清楚OP的要求。 – Greg

+0

一個選項將包裝在一個'INotifyPropertyChanged'類中。這不利於OP得出這個結論。 – Bas

+0

@Bas這個問題沒有提到這個問題。如果OP實際上描述了*可以解決的問題,那麼他可以得到解決問題的答案。如果他只問​​如何做一些既不可能又毫無意義的事情,他會以此作爲答案。 – Servy

1

我想你真正想要的是實現一個 「觀察到字典」。

什麼你可能要考慮的是實現一個IDictionary TKey, TVal(你可能只是有一個通用字典作爲後備存儲),並有Item的二傳手觸發一個事件?