2017-08-06 85 views
0

如何获取添加到当前名称空间的所有用户定义控件的列表? 我正在使用C#2010.从当前名称空间获取用户定义控件列表

+1

你尝试过什么吗?阅读反思? –

+0

是的,我尝试过。控件添加到名称空间,而名称空间不是对象。我无法从命名空间中提取用户定义的控件列表。 – Farzin

回答

0

有了这些方法,我可以提取所有用户的列表在我的项目中定义的控件,并通过它在我的表单上的名称创建一个用户定义控件的实例。

 var assemblies = AppDomain.CurrentDomain.GetAssemblies();   // Get my CurrentDomain Object 
     Assembly myType = Assembly.GetExecutingAssembly();     // Extract list of all references in my project 
     foreach (var assembly in assemblies)        // Search for the library that contains namespace that have needed controls 
     { 
      if (assembly.GetName().ToString().ToUpper().IndexOf("FIBACONTROLS") > -1) 
      { 
       myType = assembly;           // Get All types in the library 
       List<Type> myTps = myType.GetTypes().ToList(); 


       Type mT = null; 
       foreach (Type selType in myTps)        // Find the type that refer to needed user-defined control 
       { 
        if (selType.Name.ToUpper() == "FIBACOLORPICKER") 
        { 
         mT = selType; 
         break; 
        } 
       } 

       if (mT == null) 
        return; 

       object myInstance = Activator.CreateInstance(mT);   // Created an instance on the type 
       Control mFib = (Control)myInstance;       // create the control's object 
       mFib.Name = "Hahah";          // add the control to my form 
       mFib.Left = 100; 
       mFib.Top = 200; 
       mFib.Visible = true; 

       this.Controls.Add(mFib); 

       break; 
      } 
     } 

我尝试添加一些评论来描述它的代码。

它的工作,并确定有一些更好的方式来做到这一点,但我是C#新手,我相信我找到的解决方案并不是最好的。

0

您可以使用反射。试试这个代码:

public static class ControlsFinder 
{ 
    public static List<Type> FindControls(Assembly controlsLibrary, 
     string rootNamespace, bool includeNestedTypes = true) 
    { 
     var parent = typeof(UserControl); 
     return controlsLibrary.GetTypes() 
      .Where(t => (includeNestedTypes 
       ? t.FullName.StartsWith(rootNamespace) 
       : t.FullName.Equals($"{rootNamespace}.{t.Name}")) 
       && parent.IsAssignableFrom(t)) 
      .ToList(); 
    } 
} 

用例:

var controls = ControlsFinder.FindControls(Assembly.GetExecutingAssembly(), "WinFrm"); 

如果你只是想名字,你可以从controls选择它们:

var names = controls.Select(t => t.Name).ToArray(); 
+0

我不知道哪里错了。我做了一个用户定义的控件,并将它的项目添加到我的主应用程序项目的引用中。现在,我绝不会得到添加到我的主应用程序项目中的用户定义控件的名称。该代码也用0成员返回控件。 – Farzin

+0

我已更新答案。一定要将正确的程序集传递给'FindControls'。我已经使用了'GetExecutingAssembly',但它只是一个例子 –

+0

感谢您的帮助,但它不起作用。我怎样才能上传我的简化项目? – Farzin

相关问题