Как найти все статические конструкторы?
У меня есть большое решение Visual Studio многих проектов С#. Как найти все статические конструкторы? У нас было несколько ошибок, в которых некоторые делали глупые вещи, я хочу проверить других.
Ответы
Ответ 1
В Visual Studio вы можете искать в коде, используя регулярное выражение.
Попробуйте следующее:
static\s+\w+\s*\(
![search box]()
Вы можете настроить набор символов, если вы позволите своим разработчикам использовать другие чем буквы, цифры и подчеркивание. Упрощенное регулярное выражение с использованием \w
Это работает, потому что для другого использования ключевого слова static
требуется, по крайней мере, тип возврата.
Ответ 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 должен работать, хотя я его не тестировал.
Ответ 3
Вы можете попытаться использовать отражение над встроенными сборками, а не искать исходный код: http://msdn.microsoft.com/en-us/library/h70wxday(v=vs.110).aspx Это может быть быстрее/проще, чем grepping текст.
Вы также можете посмотреть такие инструменты, как NDepend: http://www.ndepend.com/ Это позволит вам писать запросы linq по коду. Это не дешево, однако.
Ответ 4
Вы можете использовать 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