Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定运行时是否使用了枚举值?_C#_Linq_Entity Framework_Reflection - Fatal编程技术网

C# 如何确定运行时是否使用了枚举值?

C# 如何确定运行时是否使用了枚举值?,c#,linq,entity-framework,reflection,C#,Linq,Entity Framework,Reflection,我们使用一种准动态方法,使用t4模板从sql查找表创建枚举。该模板为符合查找模式的每个表生成一个枚举。其中有几个枚举没有在代码中使用,但任何枚举都可以 这很好,但现在我们被要求创建一个查找管理界面,以便用户可以添加新值、编辑描述等 他们不想修改代码中当前用作枚举值的任何项,那么是否有一种简单(或不那么简单)的方法来查询程序集以确定是否使用了枚举值 我们有很多代码类似于这个虚构的示例: public Role GetAdminRole { using (myContext ctx = new

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

如果您坚持在运行时进行检查,则可以使用上获取IL,并搜索使用枚举的位置

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

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

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


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

如果您坚持在运行时进行检查,您可以使用上获取IL,并搜索使用枚举的位置

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

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

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


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

我们越来越需要这样做(代码分析v/s运行时)。我不想解析输出IL,枚举可能会在那个时候转换为整数(这就是我在ILSpy中看到的)。我们可能只想根据分析来标记我们在数据库中使用的值。我们越来越倾向于这样做(代码分析v/s运行时)。我不想解析输出IL,枚举可能会在那个时候转换为整数(这就是我在ILSpy中看到的)。我们可能只想根据分析标记我们在db中使用的值。