如果原始类型未知,如何转换为特定类型?

时间:2009-12-23 15:22:58

标签: c# .net types

此代码表示我的逻辑。显然它不起作用。请告知如何使其发挥作用。

switch (ObjectToControl.GetType().ToString())
{
    case "DataList":
        DataList Controled = (DataList)ObjectToControl;
        break;
    case "DetailsView":
        DetailsView Controled = (DetailsView)ObjectToControl;
        break;
    case "FormView":
        FormView Controled = (FormView)ObjectToControl;
        break;
    case "ListView":
        ListView Controled = (ListView)ObjectToControl;
        break;
    default:
        GridView Controled = (GridView)ObjectToControl;
        break;
}

8 个答案:

答案 0 :(得分:3)

为什么要转换呢?

所有这些类型都继承自Control。只需键入方法的返回值作为Control,并将对象强制转换为Control。

return ObjectToControl as Control;

如果在其他地方,您需要执行只列出其中一种类型可以处理的功能,那么在那个点,在那个方法中,检查以确保在转换之前它是正确的类型并调用仅存在于该特定类型的方法。

   if (objecttoControl is TypeToCheck)
       (objecttoControl as TypeToCheck).[MethodName](parameters); 

或..

   TypetoCheck myObj = objecttoControl as TypeToCheck;
   if(myObj != null) myObj.[MethodName](parameters); 

当很有可能获得不是TypeToCheck实例的对象时(如此问题所带来的场景),第一种方法是首选方法。第二种方法更好的情况是,您希望只有TypeToCheck的实例才能到达该行代码...

答案 1 :(得分:1)

替换

ObjectToControl.GetType()

ObjectToControl.GetType().Name

如果这就是你想要做的事情。

答案 2 :(得分:1)

GetType()。ToString()返回完全限定的命名空间。 “ListView”将作为“System.Windows.Forms.ListView”返回。

答案 3 :(得分:1)

试试这个:

    object Controled = null; // Default is that we don't know what this is
    if (ObjectToControl is DataList)
        Controled = ObjectToControl as DataList;
    else if (ObjectToControl is DetailsView)
        Controled = ObjectToControl as DetailsView;
    else if (ObjectToControl is FormView)
        Controled = ObjectToControl as FormView;
    else if (ObjectToControl is ListView)
        Controled = ObjectToControl as ListView;
    else if (ObjectToControl is GridView)
        Controled = ObjectToControl as GridView;

答案 4 :(得分:1)

另一种方法是使用“is”关键字:

if(ObjectToControl is DataList)
{
  DataList Controled = (DataList)ObjectToControl;
  //Do something specific to your data list
}
else if(ObjectToControl is DetailsView)
{
  DetailsView Controled = (DetailsView)ObjectToControl;
  //Do something specific to your details view
}
//etc

这往往是一种代码气味,暗示您的设计存在问题,但前提是您不知道类的类型。

答案 5 :(得分:1)

尝试这种方式

if (ObjectToControl is CheckBox){

    ((CheckBox)ObjectToControl).IsChecked = true;
    //Code Here
}

else if (ObjectToControl is Textbox){

    //Code Here
}

这样可以避免名称空间混淆。

答案 6 :(得分:0)

如果原始类型未知且无法发现,则无法进行有效转换。话虽如此,这绝不应该发生。

由于ObjectToControl.GetType().ToString()返回类的完全限定名称,因此您的代码将始终按default大小写。

您能更具体地了解问题的性质吗?例如编译时间还是运行时间?

答案 7 :(得分:0)

ObjectToControl.GetType()。ToString()将返回命名空间+类名。也许这就是为什么你没有在你的开关中点击。