我们正在使用一种准动态方法,使用t4模板从sql查找表创建枚举。该模板为符合查找模式的每个表生成枚举。其中有几个枚举没有在代码中使用,但任何枚举都可以使用。
这很好,花花公子,但现在我们被要求创建一个查找管理界面,以便用户可以添加新值,编辑描述等。
他们不想修改当前在代码中使用的任何项目作为枚举值,所以是否有一种简单(或不那么简单)的方式来查询我们的程序集以查明是否使用了枚举值?
我们有很多类似于这个例子的代码:
public Role GetAdminRole
{
using (myContext ctx = new myContext()
{
return ctx.Roles.Where(i=> i.RoleId == (int)RoleEnum.Admin).SingleOrDefault();;
}
}
有没有办法使用Type.FindMembers()并构建一个可以查询方法内部的过滤器?
我查看了System.Reflection.Emit
命名空间,这看起来很有希望基于EnumBuilder类,但无法弄清楚如何将构建器连接到现有程序集。 System.Diagnostics.CodeAnalysis
命名空间听起来很有趣,但它只包含两个属性(用于抑制警告并从覆盖范围中排除代码)。
答案 0 :(得分:1)
如果您坚持要检查运行时,可以使用GetILAsByteArray
method上的MethodBody
class获取IL和parse that,搜索您的枚举位置使用。
你可以想象,这将是非常痛苦的,因为你必须遍历所有模块中所有模块中所有类型的所有方法。
我强烈建议您在代码上使用某种静态分析;例如,ReSharper可以告诉您是否使用了成员。
如果您想编写内部解决方案,可以查看Roslyn来分析您的代码(警告,这是撰写本文时的CTP);您可以解析项目中的代码并自行进行分析。
那就是说,你最好找一个能够分析代码而不是最终输出汇编的工具。