运行 SQL 类 .net 程序集元数据查询
Running SQL-like queries on .net assembly metadata
我知道 .net 程序集的元数据以表格方式存储,如 ECMA-335 中所述。有没有人开发出一种使用 SQL 类语言(或任何查询语言!)来查询此数据的方法?
我想这样做的原因是询问有关代码库的问题,例如:
- 给我 类 的名称和类型 T 作为字段出现的字段名。
- 给我 类 的数量,其中至少有一个字段具有值类型,并且至少有一个字段具有引用类型。
- 给我这个类型出现的次数作为一个字段。
一个解决方案可能是从程序集中读取表,并将它们加载到 SQL 数据库中,但这似乎需要很多工作,如果以前没有人这样做的话。
我认为 LINQ
工作得很好。收集相关元数据并不难:获取所有程序集、获取所有类型、获取所有成员。从那里您可以使用 LINQ
.
查询几乎所有内容
看看这个例子:
var members = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.SelectMany(x => x.GetMembers())
.ToArray();
Console.WriteLine(members.Count(x => x.MemberType == MemberTypes.Method));
我知道 .net 程序集的元数据以表格方式存储,如 ECMA-335 中所述。有没有人开发出一种使用 SQL 类语言(或任何查询语言!)来查询此数据的方法?
我想这样做的原因是询问有关代码库的问题,例如:
- 给我 类 的名称和类型 T 作为字段出现的字段名。
- 给我 类 的数量,其中至少有一个字段具有值类型,并且至少有一个字段具有引用类型。
- 给我这个类型出现的次数作为一个字段。
一个解决方案可能是从程序集中读取表,并将它们加载到 SQL 数据库中,但这似乎需要很多工作,如果以前没有人这样做的话。
LINQ
工作得很好。收集相关元数据并不难:获取所有程序集、获取所有类型、获取所有成员。从那里您可以使用 LINQ
.
看看这个例子:
var members = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.SelectMany(x => x.GetMembers())
.ToArray();
Console.WriteLine(members.Count(x => x.MemberType == MemberTypes.Method));