2017-09-13 59 views
0

我使用下面的代碼使用大會如何使用C#

int _packCounter = 0; 
Assembly assemblies = Assembly.Load("MyProjectName"); 
Form f = null; 
Type[] types = assemblies.GetTypes(); 
foreach (Type t in types) 
{ 
    if (t.IsPublic && t.BaseType == typeof(Form)) 
    { 
     f = (Form)assemblies.CreateInstance(t.FullName); 
     if (f.Tag.ToString().ToUpper() != "NO") 
     { 
      _packCounter++; 
     } 
    } 

    else if (t.IsPublic && t.BaseType == typeof(MetroForm)) 
    { 
     f = (MetroForm)assemblies.CreateInstance(t.FullName); 
     if (f.Tag.ToString().ToUpper() != "NO") 
     { 
      _packCounter++;        
     } 
    } 
} 

它做工精細,但它的使用環路來獲得在C#的形式計算在項目的形式,

我的問題是:如何它沒有任何環

編輯完成:

據我所知,它的Worki ng但通過使用Loop,這個代碼將會一次又一次地用於我的應用程序,因爲我的需求,所以有些時候我會遇到性能問題。所以我想避免循環

+0

你到底是什麼計數? *「它工作正常,但它的使用循環」* - 循環的問題是什麼? – Sinatr

+0

你不算表格。你正在尋找特定類型和他們的孩子。事實上,循環有什麼問題?太慢了?沒有得到你所期望的?由於編碼效率低,就像使用'ToString().ToUpper()'而不是'String.Equals()',並且不區分大小寫選項? –

+0

或者您是否實例化每個表單以搜索特定的屬性值?再次,這不是循環的問題。使用*屬性*,如果你想附加信息到一個類,就像.NET使用'Serializable','DisplayColumn'等一樣。你可以用'Type.GetAttributes'獲取類型的屬性,甚至檢查*特定的*屬性類型 –

回答

1

你可以使用LINQ查詢,而不是檢查的簡單的方法在每個for循環

int _packCounter = 0; 
Assembly assemblies = Assembly.Load("MyProjectName"); 
Type[] types = assemblies.GetTypes(); 
_packCounter = types.Where(x => (x.IsPublic && x.BaseType == typeof(Form)) || (x.IsPublic && x.BaseType == typeof(MetroForm))).Count(); 
+0

OP的查詢比這更復雜。 –

+0

和Form.Tag =「No」,它返回所有的表單計數 –