2012-01-31 90 views
4

一直在寻找,但没有太多的运气,我想创建一个函数,只允许某些项目作为第一个参数传递。函数中的预定义参数

例如它应该只允许下列字符串:

"error", "warning", "info" 

然后按通话将

showme("error"); 
or showme("warning"); 
or showme("info"); 

才能做到这一点?我知道我可以定义

showme(string type){} 

但最好我需要showme(string type "error"){}

+7

为什么不使用枚举,并相应切换? – Rozuur 2012-01-31 12:41:58

+0

花花公子更详细,你q不够清楚。我不能忍受你 – 2012-01-31 12:43:18

+0

谢谢Rozuur我不确定使用情况,阿里不好意思,但问题很清楚,甚至给出了例子! – Neo 2012-01-31 13:06:35

回答

4

我建议一个enum

public enum ErrorType { 
    error, 
    warning, 
    info 
} 

public void ShowMe(ErrorType errorType) { 
    switch (errorType) { 
     case ErrorType.error: 
     //do stuff 
     break; 
     case ErrorType.warning: 
     //do stuff 
     break; 
     case ErrorType.info: 
     //do stuff 
     break; 
     default: 
     throw new ArgumentException("Invalid argument supplied"); 
     break; 
    } 
} 

//Invoke the method 
ShowMe(ErrorType.info); 
+0

请注意,使用enum *不会阻止将其他值传递给'ShowMe',而不是将'error','warning'和'info'传递给其他值。 – dtb 2012-01-31 12:52:05

+0

@dtb,你能再解释一下吗?在我上面的例子中,如果除'ErrorType'之外的类型传递给'ShowMe',编译器会不会产生错误? – 2012-01-31 12:56:05

+1

是的,如果'ErrorType'以外的类型传递给'ShowMe',编译器会产生一个错误。但我正在讨论'ErrorType.error','ErrorType.warning'和'ErrorType.info'之外的'ErrorType'类型的值。例如,您可以在没有任何编译时或运行时错误的情况下将'(ErrorType)42'传递给'ShowMe'。这就是为什么你需要一个'默认'的情况。 – dtb 2012-01-31 13:01:27

0

可以包取决于您所设置的值与私有构造函数的类的逻辑,并且无论是通过检索实例单身属性或通过工厂方法。

喜欢的东西:

public class StringConstraint 
{ 
    private StringConstraint() 
    public static readonly StringConstraint error = new StringConstraint() 
    ... 

    public void DoStuffWithStringValue() 
    { 
     // Here you do the logic that depends on your particular string value 
     // e.g. (always) log a message as an error 
    } 
} 

这迫使你永远只传递符合要实现为每个三根弦的逻辑实例。