マネージャーから、プロジェクトの各 .cs ファイル内で使用できる関数のリストを取得するように依頼されました。
しかし、.cs ファイルの数は膨大です。
手動で見るのは大変です。
スクリプトまたはコードを記述して .cs ファイル内の関数名を見つける方法はありますか?
マネージャーから、プロジェクトの各 .cs ファイル内で使用できる関数のリストを取得するように依頼されました。
しかし、.cs ファイルの数は膨大です。
手動で見るのは大変です。
スクリプトまたはコードを記述して .cs ファイル内の関数名を見つける方法はありますか?
反射を使用します。すべてのファイルがプロジェクトにある場合は、次を使用できます。
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ファイルを探し、実装します各ファイル内のメソッド宣言を区別できるパーサー(それを支援するためにレクサーも必要になる場合があります)。どちらについてもひどく難しいことは何もありませんが、それらはいくつかの作業を必要とし、ここで答えとして含めるには複雑すぎます。少なくとも、これは、誰かがより簡単な方法を提案できない限り、私が考えることができるすべてのタイプのメソッド宣言をカバーする最も簡単な答えです。
Roslynを見たことがありますか?
Doug Finke による Get-RoslynInfo スクリプト コマンドレットを確認してください: http://www.dougfinke.com/blog/index.php/2011/10/30/analyze-your-c-source-files-using-powershell-and-the -get-roslyninfo-コマンドレット/
csharp ファイルをアセンブリにコンパイルできない場合は、パーサーを作成する必要があります。メソッド宣言に一致する正規表現を書くのはかなり簡単です (C# 言語仕様を見てください)。ただし、いくつかの誤検出 (ブロック コメントで宣言されたメソッド) が発生し、getter と setter も考慮する必要があります。
1 つ以上のアセンブリがある場合は、非常に簡単です。Powershell: から System.Reflection を使用することもできます[System.Reflection.Assembly]::ReflectionOnlyLoad(..)
。または、アセンブリ検査に Mono.Cecil を使用できます。
ただし、アセンブリが既にある場合は、NDependを使用してください。必要以上のコード情報が得られ、無料試用版があります。
前述のようにリフレクションを使用します。これにより、作成した関数のみが返されます。
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() のオーバーロードを使用して、他の投稿で述べたようにバインディング フラグを使用してパブリックにフィルター処理できます。
私は次のコードで試しました。これを試してください。
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();
}
}
}
Do not create something yourself if someone else has already done the hard work.
Since you have the source code, use a tool like Sandcastle which is designed for generating documentation of the source code. You haven't specified what format the output needs to be, so this may or may not be acceptable.
This is something your project/team should be able to do at any time; someone could add a new method or class 5 minutes after you're finished, making your work obsolete.