C# 当原始类型未知时,如何转换为特定类型?

C# 当原始类型未知时,如何转换为特定类型?,c#,.net,types,C#,.net,Types,这段代码代表了我的逻辑。显然,它不起作用。请就如何使其工作提出建议 switch (ObjectToControl.GetType().ToString()) { case "DataList": DataList Controled = (DataList)ObjectToControl; break; case "DetailsView": DetailsView Controled = (DetailsView)ObjectT

这段代码代表了我的逻辑。显然,它不起作用。请就如何使其工作提出建议

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;
}

如果原始类型未知且无法发现,则无法进行有效转换。话虽如此,这种情况永远不会发生

由于ObjectToControl.GetType.ToString返回类的完全限定名,因此代码将始终符合当前的默认情况

你能更具体地说明问题的性质吗?例如,是编译时还是运行时?

替换

ObjectToControl.GetType()


如果您正试图这样做。

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

GetType.ToString返回完全限定的名称空间。ListView将作为System.Windows.Forms.ListView返回。

为什么要转换它

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

return ObjectToControl as Control;
如果在其他地方,您需要执行仅列出的一种类型可以处理的功能,那么此时,在该方法中,在强制转换和调用仅存在于该特定类型上的方法之前,请检查以确保其类型正确

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

第一种方法是,当很有可能获取的对象不是这个问题所提出的场景中的TypeToCheck实例时,首选第一种方法。第二种方法在您希望只有TypeToCheck的实例才能访问该行代码的情况下更好

试试这个:

    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;

另一种方法是使用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
这往往是一种代码气味,意味着如果您事先不知道类的类型,您的设计会有问题。

请尝试这种方法

if (ObjectToControl is CheckBox){

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

else if (ObjectToControl is Textbox){

    //Code Here
}

这将避免名称空间混乱。

切换后,您使用“Controlled”做什么?Elisha的评论非常贴切。这个问题的答案在很大程度上取决于转换发生后您计划做什么。失败;Controled在if块之后不在作用域内。直到出现一个完全不同的.DataList。
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
if (ObjectToControl is CheckBox){

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

else if (ObjectToControl is Textbox){

    //Code Here
}