1

我们正在使用准动态方法使用 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 戳时,我发现我知道但没有放在一起,方法中的枚举值在编译时以上述方式使用时会转换为它们的整数值。

4

1 回答 1

1

如果您坚持在运行时检查,您可以使用上的GetILAsByteArray方法来获取 IL 并解析它,搜索使用枚举的地方。MethodBody

正如您可以想象的那样,这将是非常痛苦的,因为您必须遍历所有模块、所有程序集中的所有类型中的所有方法。

强烈建议您对代码使用某种静态分析;例如, ReSharper可以告诉您是否使用了成员。

如果您想编写内部解决方案,可以查看Roslyn来分析您的代码(警告,在撰写本文时它是 CTP);您可以解析项目中的代码并自己进行分析。

也就是说,您最好找到一个分析代码而不是最终输出程序集的工具。

于 2012-10-19T15:37:02.063 回答