2013-07-03 40 views
1

我在C#窗體中的事件處理程序的上下文中討論,但我假設答案可以在C#中的任何地方使用。有沒有辦法在同一行中投射對象並訪問其屬性?

舉一個例子,我有一個表單,它有許多複選框,每個按鈕都激活一個按鈕。該事件的CheckedChanged是一個函數,對於每個複選框非常相似的處理,它看起來是這樣的現在:

private void acheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    int uniquetocheckbox = 12345; 

    if(acheckbox.CheckedChanged) 
    { 
      ThisFunction(uniquetocheckbox, true); 
      AssociatedButton.Enabled = true; 
    } 
    else 
    { 
      ThisFunction(uniquetocheckbox, false); 
      AssociatedButton.Enabled = false; 
    } 
} 

有很多的這些複選框,我試圖削減和過去的代碼對於每一個,並儘可能少的變化,所以我想要做這樣的事情:

private void acheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    int uniquetocheckbox = 12345; 

    if((CheckBox)sender.Checked) //CHANGE HERE 
    { 
      ThisFunction(uniquetocheckbox, true); 
      AssociatedButton.Enabled = true; 
    } 
    else 
    { 
      ThisFunction(uniquetocheckbox, false); 
      AssociatedButton.Enabled = false; 
    } 
} 

這是行不通的。最簡單的解決辦法是這樣的:

private void acheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    int uniquetocheckbox = 12345; 
    CheckBox cb = (CheckBox)sender; 

    if(cb.Checked) //CHANGE HERE 
    { 
      ThisFunction(uniquetocheckbox, true); 
      AssociatedButton.Enabled = true; 
    } 
    else 
    { 
      ThisFunction(uniquetocheckbox, false); 
      AssociatedButton.Enabled = false; 
    } 
} 

而是出於好奇純我想知道是否有辦法做到這一點像我給了第二個例子一行。我想知道,因爲我認爲它看起來更好,顯然縮短了一行。

+4

不('(CheckBox)sender).Checked'工作嗎? – RBarryYoung

+1

除了答案之外,還可以通過下面的方法縮短答案:var isChecked =((CheckBox)sender)。 ThisFunction(uniquetocheckbox,isChecked); AssociatedButton.Enabled = isChecked;' –

+0

@MikeMcCaughan輝煌,甚至沒有想到這一點。將實施這一點。 – SmashCode

回答

7

我認爲你只是缺少一組括號。你想轉換爲Checkbox,則得到的屬性:

if (((CheckBox)sender).Checked) 

這將迫使運營的第一順序來投,然後獲取屬性自投結果。

+0

您應該指出,OPs語法試圖從'.Checked'屬性中輸出結果,以清楚地說明代碼無法工作的原因。 –

0

你只需要一對夫婦更括號中的if聲明:

if (((CheckBox)sender).Checked) 
{ 
    ... 
} 
3

當然,這是可能的。你剛剛錯過了另一組括號:

if(((CheckBox)sender).Checked) 

但是,我不會這樣做。爲什麼?如果您想按自己的方式再次訪問sender作爲文本框,則不需要再次投射。

2

您可以。例如:

object o; 
o = new SomeType(); 
var prop = ((SomeType)o).SomeProperty; 
1

它需要是這樣的:

if(((CheckBox)sender).Checked) //CHANGE HERE 

但我個人喜歡你已經證明更好的方式。那樣如果需要再次鑄造它,它已經完成了。

1

不知道任何C#但((CheckBox)sender).Checked)應該工作。在java中的「。」 (成員訪問權限)的優先級高於cast,所以像這樣放置括號應該強制首先發生。

相關問題