簡體   English   中英

如何確定運行時是否使用了枚舉值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM