2017-08-06 6 views
0

Wie kann ich eine Liste aller benutzerdefinierten Steuerelemente abrufen, die dem aktuellen Namespace hinzugefügt wurden? Ich benutze C# 2010.Abrufen einer Liste benutzerdefinierter Steuerelemente aus dem aktuellen Namespace

+1

Haben Sie etwas versucht? Lesen Sie über Reflektion? –

+0

Ja, ich habe es versucht. Steuerelemente werden dem Namespace hinzugefügt, und der Namespace ist kein Objekt. Ich konnte die Liste der benutzerdefinierten Steuerelemente nicht aus dem Namespace extrahieren. – Farzin

Antwort

0

Mit dieser Methode i Liste aller Benutzer extrahieren definierte Steuerelemente in meinem Projekt und erstellen Sie eine Instanz des benutzerdefinierten Steuerelements anhand seines Namens in meinem Formular.

 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; 
      } 
     } 

Ich versuche, einen Kommentar zu schreiben, um es zu beschreiben.

Es funktioniert und sicher gibt es einen besseren Weg, es zu tun, aber ich bin neu in C# und ich bin mir sicher, dass die Lösung, die ich gefunden habe, nicht die beste ist.

0

Sie können Reflexion verwenden. Versuchen Sie diesen Code:

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(); 
    } 
} 

Anwendungsbeispiel:

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

Wenn Sie nur Namen möchten Sie sie von controls wählen:

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

Ich weiß nicht, wo es falsch ist. Ich habe ein benutzerdefiniertes Steuerelement erstellt und das Projekt zu der Referenz meines Haupt-App-Projekts hinzugefügt. Jetzt kann ich auf keinen Fall den Namen meines benutzerdefinierten Steuerelements abrufen, das meinem Haupt-App-Projekt hinzugefügt wurde. Dieser Code return steuert auch mit 0 Mitgliedern. – Farzin

+0

Ich habe die Antwort aktualisiert. Achten Sie darauf, die korrekte Assembly in 'FindControls' zu übergeben. Ich habe "GetExecutingAssembly" verwendet, aber es ist nur ein Beispiel –

+0

Danke für Ihre Hilfe, aber es funktioniert nicht. Wie kann ich mein vereinfachtes Projekt hochladen? – Farzin

Verwandte Themen