1

我有一个 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;
        }            
    }
4

4 回答 4

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 语句,这使得它更像是一个宏而不是函数)是行不通的。

于 2009-08-17T16:05:52.150 回答
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!");
        }            
    }
于 2009-08-17T15:48:38.533 回答
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)

    }
于 2009-08-17T15:54:14.093 回答
0

如果您只有 2 个值要比较 - 请改用 IF 语句

于 2009-08-17T15:55:15.667 回答