2017-09-13 51 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”,它返回所有的表单计数 –