C # перебирать случаи переключения - PullRequest
1 голос
/ 01 сентября 2009

Можно ли программно извлечь весь случай переключения? Я понятия не имею, может быть, по ИЛ, но не знаю, как это сделать ...

На самом деле моя глобальная проблема заключается в следующем: я получил случай siwtch со строкой в ​​качестве имени свойства. Метод очень важен, и регрессия не допускается. Я не хочу, чтобы рефакторинг нарушил это, поэтому я хочу, чтобы метод проверял, что вся строка case является фактически реальными свойствами моих объектов. (Примечание: значение по умолчанию возвращает что-то, поэтому я не могу выбросить исключение для измененного недействительного значения).

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

Есть способы избежать использования имен свойств как строк непосредственно в вашем коде. Я разместил фрагмент кода здесь .

Затем, вместо использования оператора switch, реализуйте что-то вроде этого:

private IDictionary<string, Action> _actions;

public void RegisterAction(string propertyName, Action action)
{
    _actions.Add(propertyName, action);
}

public void DoSomething(string propertyName)
{
    _actions[propertyName]();
}

Когда вы вызываете оба метода, убедитесь, что вы используете класс Member фрагмента кода (см. Ссылку) вместо непосредственного использования имен свойств. Таким образом, вы можете убедиться, что ваш код защищен от рефакторинга, потому что он не содержит никаких «волшебных строк».

С наилучшими пожеланиями

2 голосов
/ 01 сентября 2009

В IL оператор switch компилируется во что-то вроде этого:

// ...
L_000c: ldloc.1 
L_000d: ldstr "case1"
L_0012: call bool [mscorlib]System.String::op_Equality(string, string)
L_0017: brtrue.s L_0035
L_0019: ldloc.1 
L_001a: ldstr "case2"
L_001f: call bool [mscorlib]System.String::op_Equality(string, string)
L_0024: brtrue.s L_0042
L_0026: ldloc.1 
L_0027: ldstr "case3"
L_002c: call bool [mscorlib]System.String::op_Equality(string, string)
L_0031: brtrue.s L_004f
// ...

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

Единственный способ проверить это - это охватить все случаи и убедиться, что у вас не будет нулевого PropertyInfo. Если код, с которым вы работаете, очень важен и не может потерпеть неудачу, возможно, в любом случае использовать отражение довольно опасно. Можете ли вы перейти на более безопасный дизайн?

1 голос
/ 01 сентября 2009

Получение значений в переключателе не будет тривиальным ...

Если вы используете перечисление в переключателе вместо строк, вы можете легко получить значения перечисления, используя Enum.GetValues.

0 голосов
/ 01 сентября 2009

Напишите скрипт на AWK, Perl или любом другом для проверки самого источника и запускайте его перед каждой сборкой.

...