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