2014-09-18 6 views
14

У меня есть большое решение Visual Studio многих проектов C#. Как найти все статические конструкторы? У нас было несколько ошибок, в которых некоторые делали глупые вещи, я хочу проверить других.Как найти все статические конструкторы?

+0

grep the codebase? Какая версия Visual Studio? – AlG

+1

Возможно, простое регулярное выражение типа «static \ w + \ (« может помочь найти – HimBromBeere

+0

@HimBromBeere: использование '\ w' на самом деле проще и охватывает больше случаев. Я обновил свой ответ в этом направлении. Thx –

ответ

23

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

Попробуйте это:

static\s+\w+\s*\(

search box

Вы можете настроить набор символов, если вы позволите вашим разработчикам использовать другие than letter, numbers and underscore. Упрощенное регулярное выражение с использованием \w

Это работает, потому что для других целей использования ключевого слова static требуется, по крайней мере, тип возврата.

+0

Спасибо, работает. –

1

Вы можете попробовать использовать отражение над встроенными сборками, а не искать исходный код: http://msdn.microsoft.com/en-us/library/h70wxday(v=vs.110).aspx Это может быть быстрее/проще, чем grepping текста.

Вы также можете посмотреть такие инструменты, как NDepend: http://www.ndepend.com/ Фактически это позволит вам писать запросы linq по коду. Это не дешево.

1

Вы можете использовать ildasm и сбросить сборку, затем выполнить поиск файла .il для .cctor (не .ctor, используйте дополнительный c). Статические конструкторы реализованы с использованием методов .cctor.

ildasm program.exe /out=program.il 

Пример:

.method private hidebysig specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  13 (0xd) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "Static constructor" 
    IL_0006: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000b: nop 
    IL_000c: ret 
} // end of method Animal::.cctor 
2

Я думаю, что с помощью отражения является самым быстрым способом для достижения этой цели. Вы можете добавить новый проект в решение и написать небольшой фрагмент кода (возможно, за исключением имен конструкторов в текстовый файл):

public static IEnumerable<ConstructorInfo> GetAllStaticConstructorsInSolution() 
{ 
    var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

    return assemblies.SelectMany(assembly => assembly.DefinedTypes 
        .Where(type => type.DeclaredConstructors.Any(constructorInfo => constructorInfo.IsStatic)) 
        .SelectMany(x => x.GetConstructors(BindingFlags.Static))) 
        .Distinct(); 
} 

Над Linq запрос должен работать, хотя я не проверял.

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