2009-04-20 83 views
0

我試圖在大代碼庫中找到特定類型(例如Widget)的所有成員字段(但不是局部變量)。查找C#中特定類型的成員字段

我使用VS2005,但不介意non-vs解決方案。

如果我使用C++我可能會限制我的搜索頭文件,但並不在C#中工作

我可以搜索「窗口小部件M_」,但風險還沒有被正確命名丟失的字段。

還有其他想法嗎?


進一步信息:

我的Widgets在我WidgetManager一個明確的清單。任何其他類都可以有一個指向Widget的指針。如果我從WidgetManager中刪除了一個Widget,我希望指向該Widget的所有其他指針(無論它們在解決方案中的哪個位置)都設置爲null。

從WidgetManager中刪除Widget時會引發「銷燬」事件。我正在考慮在所有存儲對Widgets引用的類中捕獲該事件,並在刪除Widgets時將它們的引用設置爲null。我原來的問題是要確認我找到了所有的參考資料。

如果任何人都可以想到更好的方法,那麼讓我知道。

+0

您是否想要在代碼庫中查找所有的事件? – ChrisF 2009-04-20 14:15:50

回答

0

代碼庫是一種解決方案嗎?如果是這樣,請轉到該類型,右鍵單擊該類型的名稱,然後選擇「查找所有引用」。

+0

這將包括OP不需要的局部變量。 – JaredPar 2009-04-20 14:16:33

2

使用反射檢查編譯的dll。通過各種迭代,發現引用類型的所有屬性..

編輯

下面是查找所有特性暴露在當前應用程序域的字符串的樣本。

public static void Main(string[] args) 
{ 
    printAllPublicPropertiesInCurrentAppDomain(typeof(string)); 
} 

private static void printAllPublicPropertiesInCurrentAppDomain(Type typeToFind) 
{ 
    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     foreach (Type type in assembly.GetTypes()) 
     { 
      foreach (PropertyInfo info in type.GetProperties()) 
      { 
       if (info.PropertyType == typeToFind) 
       { 
        Console.WriteLine("Assembly: {0}, Type: {1}, Property: {2}", assembly.GetName().Name, type.Name, info.Name); 
       } 
      } 
     } 
    } 
} 

EDIT 2

我不知道是什麼的GetProperties返回默認,但它確實有過載,讓你指定的BindingFlags。您可以指定:

type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 

所有公共或私人的實例和靜態特性。

+0

這仍然適用於私人領域(即不屬性)? – 2009-04-20 14:30:14

0

我想利用現有的編譯器,否則你將不得不實現至少一個C#解析器的子集,以獲得合理可靠的答案。另外,我個人想避免加載相關的程序集並使用Reflection,因爲這可能會導致副作用。

NDepend提供了一個Code Query Language它允許你回答這個和更復雜的問題。不是免費的,但很好。

我認爲Cecil可以用來對付編譯後的程序集,只需要更多的工作。

0

您正在尋找的功能在VS 2005中不存在。最接近的功能是「查找所有引用」,但會包含您希望排除的局部變量引用。

一旦你找到這些字段,你能告訴我們更多一點你想做什麼嗎?如果它只是用於計算,則可以使用反射來查找所有的字段並獲得準確的計數。如果它涉及源更改等更多涉及的內容,則可能必須使用各種分析器。