2013-07-24 2 views
3

Теоретически можно найти consts в class во время выполнения?Поиск consts в классе во время выполнения

У меня есть статический класс, полный consts подобных этому:

public static class Constants { 
    public const string Yes = "Yes"; 
    public const string No = "No"; 
} 

и мне было интересно, если я мог бы создать UnitTest, которые могли бы взять класс Константы и прочитать все consts внутри него. Идея заключается в том, что я могу написать один единичный тест, который затем выполняется против всех константных строк. Поэтому, если я добавлю больше строки в класс, модульный тест не должен изменяться.

Я считаю, что ответ здесь нет ... но думал, что стоит на всякий случай спросить!

+0

Посмотрите в отражение (конкретный пример для констант: http://weblogs.asp.net/whaggard/archive/2003/02/20/2708.aspx) – SimpleVar

+0

Что тип единичного теста вы бы писали от констант? –

+0

Класс выше тривиален, но в фактическом коде константы относятся к строкам RegEx, которые мы хотим проверить, действительны во время компиляции. – Nick

ответ

5

Попробуйте что-то вроде этого:

var t= typeof(Constants).GetFields(BindingFlags.Static | BindingFlags.Public) 
        .Where(f => f.IsLiteral); 
foreach (var fieldInfo in t) 
{ 
    // name of the const 
    var name = fieldInfo.Name; 

    // value of the const 
    var value = fieldInfo.GetValue(null); 
} 
+0

Заменены. с; в конце первой строки, но кроме этого, использовался этот код дословно. благодаря – Nick

2

Использование отражения вы можете использовать IsLiteral свойство поля, чтобы определить, является ли он константой:

var consts = myType.GetFields(BindingFlags.Static | BindingFlags.Public).Where(fld => fld.IsLiteral); 

Вы можете сделать в соответствии с требованиями с этим в тестовом модуле.

+0

Возможно, я ошибаюсь, но, насколько я помню, 'IsLiteral' дает true для полей' readonly', поэтому вам нужно протестировать '! Fld.IsInitOnly', чтобы отфильтровать их. – Andrei

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