有没有办法从.cs文件中获取函数列表?

时间:2012-08-31 12:35:26

标签: c# powershell powershell-v2.0

我的经理让我获取项目中每个.cs文件中可用的功能列表。

但是.cs文件的数量很大。

很难通过手动查看。

有没有办法通过编写脚本或代码在.cs文件中找到函数名?

7 个答案:

答案 0 :(得分:5)

使用反射。如果所有文件都在项目中,那么您可以使用:

Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type toCheck in toProcess)
{
    MemberInfo[] memberInfos = toCheck.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | OtherBindingFlagsYouMayNeed);
    //Loop over the membersInfos and do what you need to such as retrieving their names
    // and adding them to a file
}

如果将项目编译为dll,则可以使用:

Assembly assembly = Assembly.LoadFrom(filePath); //filePath is for the dll
Type[] toProcess = assembly.GetTypes();
//rest of the code is same as above

编辑: 如果您希望找到每个物理文件的函数@BAF提及,您将获得程序集的基本目录(通过.CodeBase),然后执行目录树遍历查找所有.cs文件然后您将实现解析器这可以区分每个文件中的方法声明(可能还需要一个词法分析器来帮助它)。两者都没有什么特别困难,但它们确实需要一些工作而且太复杂而不能作为答案包含在这里。这是最简单的答案,涵盖了我能想到的所有类型的方法声明,除非有人能提出更简单的方法。

答案 1 :(得分:4)

答案 2 :(得分:0)

使用上面提到的反射 - 这将仅返回您所做的功能:

  Assembly a = Assembly.LoadFile("Insert File Path");
  var typesWithMethods = a.GetTypes().Select(x => x.GetMethods(BindingFlags.Public).Where(y => y.ReturnType.Name != "Void" &&
                                                    y.Name != "ToString" &&
                                                    y.Name != "Equals" &&
                                                    y.Name != "GetHashCode" &&
                                                    y.Name != "GetType"));
  foreach (var assemblyType in typesWithMethods)
  {
    foreach (var function in assemblyType)
    {
      //do stuff with method
    }
  }

您将拥有一个类型列表,然后在每个类型中列出一系列函数。

  public class TestType
  {
    public void Test()
    {

    }
    public string Test2()
    {
      return "";
    }
  }

使用上面的测试类型,我提供的代码将打印Test2,因为这是一个函数。希望这是你想要的。

编辑:显然,您可以使用GetMethods()中的重载,使用其他帖子中提到的绑定标记过滤到public。

答案 3 :(得分:0)

如果您无法将csharp文件编译为程序集,则必须编写解析器。编写与方法声明匹配的正则表达式相当容易(查看C#语言规范)。但是你会得到som误报(在块注释中声明的方法),你还必须考虑getter和setter。

如果你有一个或多个组件,那很容易。您甚至可以使用powershell中的System.Reflection:[System.Reflection.Assembly]::ReflectionOnlyLoad(..)。或者您可以使用Mono.Cecil进行装配检查。

但是如果你已经拥有了程序集,那么使用NDepend。您将获得比您需要的更多代码信息,并且他们可以免费试用。

答案 4 :(得分:0)

如果其他人已经完成了艰苦的工作,请不要自己创造。

由于您拥有源代码,请使用Sandcastle之类的工具,该工具用于生成源代码的文档。您尚未指定输出所需的格式,因此这可能是可接受的,也可能是不可接受的。

这是您的项目/团队随时可以做的事情;有人可以在你完成后5分钟添加一个新的方法或类,使你的工作过时。

答案 5 :(得分:0)

我尝试使用以下代码,请尝试以下代码。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace filedetection
{
class Program
{
    static void Main(string[] args)
    {
        string path = @"D:\projects\projectsfortest\BusinessTest";
        DirectoryInfo d = new DirectoryInfo(path);//Assuming Test is your Folder
        FileInfo[] Files = d.GetFiles("*.cs"); //Getting Text files
        string str = "";
        foreach (FileInfo file in Files)
        {                
            Program program = new Program();
            List<string> allmethord = program.GetAllMethodNames(path+"\\"+file.Name);
            foreach (string methord in allmethord)
            {
                Console.WriteLine(methord);
            }
        }

        Console.ReadKey();
    }

    public List<string> GetAllMethodNames(string strFileName)
    {
        List<string> methodNames = new List<string>();
        var strMethodLines = File.ReadAllLines(strFileName)
                                    .Where(a => (a.Contains("protected") ||
                                                a.Contains("private") ||
                                                a.Contains("public")) &&
                                                !a.Contains("_") && !a.Contains("class"));
        foreach (var item in strMethodLines)
        {
            if (item.IndexOf("(") != -1)
            {
                string strTemp = String.Join("", item.Substring(0, item.IndexOf(")")+1).Reverse());
                strTemp = String.Join("", strTemp.Substring(0, strTemp.IndexOf("  ")).Reverse());
                methodNames.Add(strTemp);                    
            }
        }
        return methodNames.Distinct().ToList();
    }
  }
}

答案 6 :(得分:0)

在“项目属性”的“构建”部分中,启用XML文档文件。建立您的专案。输出的XML文件为您提供所有类及其方法,参数名称/类型等的列表。

enter image description here