如何找到所有静态构造函数?

时间:2014-09-18 13:16:16

标签: c# .net visual-studio

我有许多C#项目的大型Visual Studio解决方案。如何找到所有静态构造函数?我们有一些错误,其中一些做了愚蠢的事情,我想检查其他人。

4 个答案:

答案 0 :(得分:23)

在Visual Studio中,您可以使用正则表达式搜索代码。

试试这个:

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

search box

如果您允许开发人员使用其他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