2013-09-24 44 views
0

所以我有一個非常簡單的問題。我有一個接收2個參數的函數。下面是函數的定義:引用未定義的屬性

private void Document_TextChanged(object sender, EventArgs e) 

我知道發件人對象將始終有一個名爲文本屬性,但編譯器顯然不知道這一點。有沒有一種好的方法可以讓我引用這個屬性而不會收到編譯器錯誤?顯然sender.property不起作用。

+0

是什麼文件?什麼樣的? – Sadique

+0

將發件人轉換爲正確的類型。假設你知道這個事件是由一個按鈕觸發的,你可以這樣做:'((Button)sender).Text' – DarkBee

+0

Document是窗體中的文本框。這裏定義:http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox.aspx – Nick

回答

4

使用演員。如果你總是確保發件人是類型SOMETYPE的,你可以簡單地使用

SomeType senderAsSomeType = (SomeType)sender; 

如果你不能確定是什麼類型,你可以使用as運營商投的值,如果它的類型是SOMETYPE的,或得到null如果不是:

SomeType senderAsSomeType = sender as SomeType; 
if (senderAsSomeType != null) { 
    //do something 
} 
1

另一種選擇是,如果有是幾班的機會,像這樣的文本屬性使用動態:

dynamic textProperty = sender; 
Console.WriteLine(textProperty.Text); 
+1

這是一個有趣的方法,可以保存一些字符。但是,在c#中輸入鴨子是一種片狀做法。如果你想要一個對象參與到外部系統中,那麼實際上應該有一個通用接口 - 在這種情況下是_Control_。這樣,如果在項目生命週期中發生任何更改,您將得到編譯時錯誤,而不是運行時錯誤。 – Gusdor

+1

此外,動態是爲了與動態環境進行互操作。 COM和DOM是主要的罪犯。除此之外,你可能永遠不需要它。 – Gusdor