2013-03-06 6 views
2

У меня есть функция, которая имеет один параметр/аргумент типа String,:.Конкретные значения в качестве аргумента для функции

 public void foo(String myParam) 
     { 
      //do something 
     } 

возможные значения струны ограничено (например, «тест», «test2» и "test3"), любое другое значение myParam вызовет ошибку.

Можно ли ограничить возможные значения myParam без корпуса коммутатора, который будет проверять значение myParam?

Также возможно передать другой объект моей функции, которая обертывает реальное значение, которое мне нужно.

Есть ли для вас решение стандартного/лучшего способа?

ответ

10

Вы можете создать перечисление

public enum MyParam 
{ 
    test, 
    test2, 
    test3 
} 

И использовать ToString, чтобы получить строковое представление ваших enum

public void foo(MyParam myParam) 
{ 
    if(!Enum.IsDefined(typeof(MyParam),myParam)) 
     throw new ArgumentException(); 
    myParamString = myParam.ToString(); 
} 
+0

Да, похоже, это подходит для перечисления. Вы можете проверить его, выполнив «Contract.Requires (Enum.IsDefined (typeof (MyParam), значение))' –

+0

как выглядел бы вызов этой функции? – Zteve

+0

Вы можете называть его как 'foo (MyParam.test)' или присваивать переменную 'enum' переменной и передавать ее. – juharr

1

Единственный способ ограничить такие значения - проверить их.

Вы можете использовать прямые сравнения строк или совпадения регулярных выражений - если строка не совпадает с совпадением, выведите InvalidArgumentException.

Другим вариантом является создание класса, который переносит строку - при построении класса (передается в завернутой строке в качестве аргумента конструктора), вы должны протестировать, как указано выше.

0

Рассмотрим Regular Expressions; .NET предоставляет пространство имен System.Text.RegularExpressions где есть Regex -класс:

public void foo(String myParam){ 

Regex regex = new Regex(@"test\d"); 
if(regex.IsMatch(myParam)) 
    //myParam matches regex 
} 

См MSDN, где есть также информация о RegEx.

+0

test1, test2, test3 был всего лишь примером, он также может быть «tdfsg», «dcudf» и «cvb», но спасибо за вашу помощь :) – Zteve

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