我的经理让我获取项目中每个.cs文件中可用的功能列表。
但是.cs文件的数量很大。
很难通过手动查看。
有没有办法通过编写脚本或代码在.cs文件中找到函数名?
答案 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)
你看过Roslyn吗?
检查Doug Finke的Get-RoslynInfo脚本cmdlet:http://www.dougfinke.com/blog/index.php/2011/10/30/analyze-your-c-source-files-using-powershell-and-the-get-roslyninfo-cmdlet/
答案 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)