2016-11-08 101 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 –

相关问题