2016-11-08 103 views
2
private void function(object sender, EventArgs e) 

是否可以在不使用變量的情況下獲取名稱?C#在不知道類型的情況下獲取對象的名稱

if(sender.getType().Name == "Button") { 
    Button btn = sender as Button; 
    ObjName = btn.Name 
} 

if(sender.getType().Name == "CheckBox") { 
    CheckBox cbx= sender as CheckBox; 
    ObjName = cbx.Name 
} 

我有一個函數可以處理很多不同的對象類型,我唯一需要的是名稱。

+1

我的第一個想法的答案[這裏]已經顯示(http://stackoverflow.com/questions/14111512/c -sharp調查發送者);你或者需要切換所有已知類型,或者轉換爲「動態」,並希望在運行時沒有任何事情發生。 – Quantic

+3

如果所有對象都是控件,則可以將'sender'強制轉換爲Control,因爲Name屬性在Control類中定義。 –

回答

4

只是將它轉換爲它的基類型控制

var name = ((Control)sender).Name 
+0

'switch(((Control)ObjectList [i])。Name)...'這正是我想要的!謝謝:) –

+1

在這裏不能真正打敗簡單... –

0

此外,如果基本類型是不一樣的,你可以這樣思考如下:

private void function(object sender) 
{ 
    if (sender != null && sender.GetType().GetProperty("Name") != null) 
     { 
      var val = sender.GetType().GetProperty("Name").GetValue(sender); 
     } 
} 
+0

我不是這種方法的巨大粉絲的原因是,如果傳遞的對象沒有'Name'屬性,函數將會彈出。 –

+0

我試過了!但我做錯了......無法弄清楚GetValue屬性也必須接收對象:順便說一下,它是'sender.GetType()。GetProperty(「Name」)。GetValue(sender,null )'@DangerZone對我的情況它總是有一個名稱:) –

+0

需要添加空檢查以檢查名稱方法是否存在。在控制檯上完成並工作正常。 – Swetha

0

在這種情況下,你可以」使用通用的基本類型,例如,如果您同時處理來自WinForms & WPF的項目,則可以使用反射來檢查項目是否具有名稱屬性,然後如果它確實返回該值。

public string GetNameIfExists(dynamic item) 
{ 
    if (item.GetType().GetProperty("Name") != null) 
    { 
     return item.Name; 
    } 
    return null; 
} 
0

這種模式比檢查類型名較爲常見:

var btn = sender as button; 
if (btn != null) // it's a button 
{ 
    //... 
    return; 
} 
var chkbx = sender as checkbox; 
if (chkbx != null) // it's a checkbox 
{ 
    //... 
    return; 
} 
+0

我在做'switch(sender.getType()。Name){case「button」:** GetName ** break; case「CheckBox」:** GetName ** ...'。這是一個醜陋的混亂:P –

相關問題