[英]How do I find out if an enum value is used at Runtime?
我们正在使用一种准动态方法,使用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
命名空间听起来很有趣,但是它仅包含两个属性(用于抑制警告并从覆盖范围中排除代码)。
编辑:在通过ILSpy进行戳戳时,我发现我知道但没有放在一起,在编译时以上述方式使用时,方法中的枚举值会转换为它们的整数值。
如果您坚持要在运行时进行检查,则可以使用MethodBody
类上的GetILAsByteArray
方法获取IL并对其进行解析 ,以查找使用枚举的位置。
可以想象,这将非常痛苦,因为您必须遍历所有模块中所有模块中所有类型的所有方法。
我强烈建议您对代码使用某种静态分析; 例如, ReSharper可以告诉您是否使用了成员。
如果您想编写内部解决方案的代码,可以看看Roslyn来分析您的代码(警告,在撰写本文时,它是CTP); 您可以解析项目中的代码,然后自己进行分析。
就是说,最好是找到一种工具来分析代码,而不是最终的输出程序集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.