我有许多C#项目的大型Visual Studio解决方案。如何找到所有静态构造函数?我们有一些错误,其中一些做了愚蠢的事情,我想检查其他人。
答案 0 :(得分:23)
在Visual Studio中,您可以使用正则表达式搜索代码。
试试这个:
static\s+\w+\s*\(
如果您允许开发人员使用其他than letter, numbers and underscore。使用\w
这是有效的,因为static
关键字的其他用途至少需要返回类型。
答案 1 :(得分:3)
我认为使用反射是实现它的最快方法。您可以将新项目添加到解决方案并编写一小段代码(可能将构造函数名称保存到文本文件中):
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查询上面的查询应该有效,但我还没有对其进行测试。
答案 2 :(得分:1)
您可以尝试在构建的程序集上使用反射,而不是搜索源代码:http://msdn.microsoft.com/en-us/library/h70wxday(v=vs.110).aspx这可能比轻击文本更快/更容易。
您还可以查看NDepend等工具:http://www.ndepend.com/它实际上允许您在代码上编写linq查询。但它并不便宜。
答案 3 :(得分: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