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
}