2017-08-06 11 views
0

現在の名前空間に追加されたすべてのユーザー定義コントロールのリストを取得するにはどうすればよいですか? 私はC#2010を使用しています。現在の名前空間からユーザー定義コントロールのリストを取得

+1

試しましたか?反射について読む? –

+0

はい私は試みた。コントロールは名前空間に追加され、名前空間はオブジェクトではありません。私は名前空間からユーザ定義のコントロールのリストを抽出できませんでした。 – Farzin

答えて

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からそれらを選択することができ、このコードを試してみてください私のプロジェクトで定義されたコントロールを作成し、自分のフォーム上の名前でUser-defined Controlのインスタンスを作成します。

 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

リフレクションを使用できます。私はすべてのユーザーのリストを抽出することができ、これらの方法では

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

どこが間違っているのか分かりません。私はユーザー定義のコントロールを作成し、私の主なアプリプロジェクトのリファレンスにそのプロジェクトを追加しました。今では、私の主なアプリプロジェクトに追加されたユーザー定義のコントロールの名前を取得することはできません。このコードは0メンバでもコントロールを返します。 – Farzin

+0

私は答えを更新しました。 'FindControls'に正しいアセンブリを渡してください。私は 'GetExecutingAssembly'を使用しましたが、それは単なる例です –

+0

助けてくれてありがとうございますが、うまくいきません。私は単純化されたプロジェクトをどのようにアップロードできますか? – Farzin

関連する問題