2009-08-17 35 views
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; 
     }    
    } 

回答

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语句,这使得它更像一个宏而不是函数)将不起作用。

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!"); 
     }    
    } 
+0

异常解决方案很有趣,但有性能方面的问题,它确实不是一个特例;预计每个switch语句至少会发生一次。因此,我更喜欢null解决方案。 – 2009-08-17 15:58:22

+0

这很好,我只是认为应该考虑异常解决方案,好像有某种特定类型的东西需要以某种方式实施。 null解决方案更加优雅,尽管它确实会让调用此函数的代码知道可以返回null。 – 2009-08-17 16:13:53

+0

@JB:异常解决方案还会使调用该函数的代码意识到可以抛出异常,无论如何也难以知道(或推断)的可能性比空。 – 2009-08-17 16:32:24

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) 

    } 
+1

这个函数真的比只说“if(param is B)”更可读吗? – 2009-08-17 16:07:52

+0

绝对同意你的看法。 我只是做了这个具有“可扩展”版本的情况下,你需要更多的验证,只是类型检查 – 2009-08-17 17:00:31

0

如果你只有2个值与比较 - IF语句来代替

使用