0

我在一个解决方案中有两个项目,project A并且project B( using VS2010 Ultimate and C# windows application)。 Project B充当project A. 在project B我有一个包含一个chekcedlistbox控件的表单,该控件将列出所有project A表单名称和文本(此表单将让系统管理员根据用户的安全组授予用户允许查看/编辑的表单)这是我的代码:

   private void GetFormNames()
    {
        foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (Type t in a.GetTypes())
            {
                if (t.BaseType == typeof(Form))
                {
                    var emptyCtor = t.GetConstructor(Type.EmptyTypes);
                    if (emptyCtor != null)
                    {
                        var f = (Form)emptyCtor.Invoke(new object[] { });
                        string FormText = f.Text;
                        string FormName = f.Name;
                        checkedListBox1.Items.Add("" + FormText + "//" + FormName + "");
                    }
                }
            }

        }

    }

我得到的结果是我当前项目 (B) 和空行 (//) 和Select Window//MdiWindowDialog,的表单名称PrintPreview

4

3 回答 3

1
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (Assembly a in assemblies) 
{ 
    Type[] types = a.GetTypes(); 
    foreach (Type t in types) 
    { 
        if (t.BaseType == typeof(Form)) 
        { 
                  //Do Your works
        } 
    } 
} 
于 2013-04-20T11:32:51.150 回答
1

我将假设您已ProjectA正确引用并且您感兴趣的所有表单实际上都有一个无public参数构造函数。该问题可能是由于ProjectA尚未加载引起的,您可以通过多种方式解决此问题。可能最直接的方法是使用static Assembly.Load(只要文件在同一目录中,否则会变得更复杂)。

try
{
    Assembly projectA = Assembly.Load("ProjectA"); // replace with actual ProjectA name 
    // despite all Microsoft's dire warnings about loading from a simple name,
    // you should be fine here as long as you don't have multiple versions of ProjectA
    // floating around

    foreach (Type t in projectA.GetTypes())
    {
        if (t.BaseType == typeof(Form))
        {
            var emptyCtor = t.GetConstructor(Type.EmptyTypes);
            if (emptyCtor != null)
            {
                var f = (Form)emptyCtor.Invoke(new object[] { });
                // t.FullName will help distinguish the unwanted entries and
                // possibly later ignore them
                string formItem = t.FullName + " // " + f.Text + " // " + f.Name;
                checkedListBox1.Items.Add(formItem);
            }
        }
    }
}
catch(Exception err)
{
    // log exception
}

另一个(可能是更清洁的解决方案)是让您感兴趣的所有表单都从单个基本表单继承。然后,您可以从已知的程序集加载程序集,并在将其添加到列表之前Type检查每个枚举的继承自它。Type然而,这是一个更广泛的变化,并且涉及ProjectA.

于 2013-04-20T12:37:21.793 回答
0

试试这个代码:

 private void GetFormNames()
    {


        Type[] AllTypesInProjects = Assembly.GetExecutingAssembly().GetTypes();
            for (int i = 0; i < AllTypesInProjects.Length; i++)
            {
                if (AllTypesInProjects[i].BaseType == typeof(Form))
                {            /* Convert Type to Object */
                    Form f = (Form)Activator.CreateInstance(AllTypesInProjects[i]);
                    string FormText = f.Text; 
                    listBox1.Items.Add(FormText);
                }
            }

    }
于 2013-04-20T11:50:07.280 回答