2012-01-31 4 views
4

смотрели, но не очень повезло, я хочу создать функцию, которая позволяет передавать только некоторые элементы в качестве первого параметра.предопределенные параметры в функции

например. она должна позволить только следующие строки:

"error", "warning", "info" 

, то вызов будет быть

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

это может быть сделано? Я знаю, что могу определить

showme(string type){} 

, но в идеале мне нужно showme(string type "error"){}

+7

Почему не использовать перечисления, и соответственно переключаться? – Rozuur

+0

чувак более подробно, вы q недостаточно ясны. я не могу вас подстать –

+0

Спасибо Rozuur Я был не уверен в использовании, Али жаль, но вопрос очень ясный и даже приведенные примеры! – Neo

ответ

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 * не предотвращает другие значения, чем 'error',' warning' и 'info' передаются' ShowMe'. – dtb

+0

@dtb, Можете ли вы объяснить немного дальше? В моем примере выше, не будет ли компилятор генерировать ошибку, если для 'ShowMe' был передан тип, отличный от' ErrorType'? –

+1

Да, компилятор будет генерировать ошибку, если для 'ShowMe' был передан тип, отличный от' ErrorType'. Но я говорил о значениях типа 'ErrorType', кроме' ErrorType.error', 'ErrorType.warning' и' ErrorType.info'. Например, вы можете передать '(ErrorType) 42'' ShowMe' без какой-либо ошибки времени компиляции или времени выполнения. Вот почему вам нужен «дефолтный» случай. – dtb

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 
    } 
} 

Это обязывает вас только когда-либо передать экземпляры, которые соответствуют логике вы хотите реализовать для каждого из трех строк.

Смежные вопросы