我有一个反复执行某些逻辑的switch语句。而不是使用剪切和粘贴我想将它放入一个函数中,但我在这方面做得很糟糕。
这是我想要做的,但它不能编译,因为函数中的break标记不存在。任何人都可以将其重构为更好的工作版本吗?
switch(param.ToString())
{
case "1":
BreakIfNotArgumentType<B>(param);
//do stuff
break;
case "2":
BreakIfNotArgumentType<BF>(param);
//do stuff
break;
}
private T BreakIfNotArgumentType<T>(object argumentObject)
{
if (argumentObject is T)
{
return (T)argumentObject;
}
else
{
break;
}
}
答案 0 :(得分:2)
您的功能基本上是复制as
运算符的功能。
string foo = "foo";
....
object a = foo;
object b = 12;
....
string bar = a as string; // will give you "foo"
string zed = b as string; // returns null
as
运算符用作运行时安全转换。如果无法将目标实例强制转换为目标类型,则会分配空引用。因此,它只适用于引用类型。最常见的用法就是这样......
string bar = a as string;
if(bar != null)
{
// do stuff
}
因为这会在一个语句中提供类型检查和转换操作。
您应该发布switch
声明,我们可以更好地简化它。尝试编写一个真正的内联函数(你希望它将函数中的代码替换为switch语句,这使得它更像是一个宏而不是一个函数)将不起作用。
答案 1 :(得分:0)
如果参数不能被强制转换,你可以让函数返回null,或者就如何处理代码部分的几个想法抛出异常。
private T BreakIfNotArgumentType<T>(object argumentObject)
{
if (argumentObject is T)
{
return (T)argumentObject;
}
else
{
return null;
}
}
或者
private T BreakIfNotArgumentType<T>(object argumentObject)
{
if (argumentObject is T)
{
return (T)argumentObject;
}
else
{
throw CustomException("Argument wasn't valid!");
}
}
答案 2 :(得分:0)
让你的方法返回一个布尔值并检查返回值:
switch(param.ToString())
{
case "1":
if (CheckForArgumentType<B>(param))
{
// Do your cast here
param = (B)param
}
else
break;
case "2":
if (CheckForArgumentType<B>(param))
{
// Do your cast here
param = (B)param
}
else
break;
}
.................
private bool CheckForArgumentType<T>(object argumentObject)
{
return (argumentObject is T)
}
答案 3 :(得分:0)
如果您只有2个值可供比较 - 请使用IF语句