[c#] Alle Klassen aus einem Namespace

d-Stench

Erfahrenes Mitglied
Hallo,

folgende Fragen:
1. Wie kann ich alle Klassen aus einem Namespace auslesen?

(angenommen Punkt 1 währe abgehackt)
2. Jetzt habe ich eine ListBox wo alle diese Klassen drin stehen. Wie kann ich folgendes nach dem Doppelklick auf die ListBox erreichen:

Code:
[this.listBox1.SelectedItem.ToString()] myControl = new [this.listBox1.SelectedItem.ToString()]();

Das was in den []-Klammern drin steht ist der Name der Klasse.


Ich habe eine .DLL-Datei wo einige UserControls sind. Ich möchte alle auslesen und dann (wie schon beschrieben) mit this.panel.Controls.Add(myControls) darstellen.

bis jetzt hab ich das mit

Code:
if(...)
{
 class1 c1 = new class1();
}
else if(...)
 class2 cs = new class2();
}
usw. gemach. Doch das ist, meiner Meinung nach eine sehr schmutzige Methode.

Hätte jemand ein Vorschlag, wie man das o.g. Problem lösen könnte?

Danke

Gruß
d-Stench

PS: Habe nichts gefunden, da ich nicht genau weis nach was (Begriffe) ich eigendlich suchen muss.
 
Da wirst du wohl mit Reflection arbeiten müssen. Ich hab dir mal ein Beispiel angehängt, mit dem du aus einem bestimmten Namespace die einzelnen Typen herausbekommst und feststellen kannst, ob es sich dabei um ein UserControl handelt, oder nicht.

Dieses Beispiel kannst du bei dir nachbauen, musst jedoch die Controls dann noch instanzieren bevor du sie zur Controls.Collection hinzufügen kannst.
 

Anhänge

  • 26803attachment.zip
    39,7 KB · Aufrufe: 120
Moin!

Schaut für mich so aus als möchtest Du sowas in der Art wie ein Pluginframework realisieren?
Wenn ja, dann erläuter uns doch mal was Du eigentlich genau machen willst.
Es ist in dem Fall Ratsam mit BasisKlassen und Interfaces zu arbeiten,
um das Verwalten der Controls zu erleichtern und um Basisfunktionalitäten
wie zB das Speichern von Einstellungen etc. realisieren zu können.
 
Hallo!

Es kann aber durchaus auch vorkommen, dass ein Namespace nicht genauer einer Assembly zugeordnet werden kann.

So suchst du assembly-übergreifend, ausgehend von der Start-Assembly, über alle referenzierten Assemblies alle Typen in einem bestimmten Namespace.

C#:
using System;
using System.Reflection;
using System.Collections;

namespace De.Tutorials.Training
{
    /// <summary>
    /// 
    /// </summary>
    /// <author>Thomas.Darimont</author>
    public class ListTypesInNamespaceExample
    {

        public static void Main(string[] args)
        {

            AssemblyName[] assemblyNames = new AssemblyName[Assembly.GetEntryAssembly().GetReferencedAssemblies().Length+1];
            assemblyNames[0] = Assembly.GetEntryAssembly().GetName();
            Assembly.GetEntryAssembly().GetReferencedAssemblies().CopyTo(assemblyNames, 1);

            foreach (AssemblyName assemblyName in assemblyNames)
            {
                Assembly assembly = Assembly.Load(assemblyName);
                Type[] types = FindAllExportedTypesInNamespaceFor(assembly, "De.Tutorials");
                Array.ForEach(types, delegate(Type type)
                {
                    Console.WriteLine(type.FullName);
                });
            }
        }

        private static Type[] FindAllExportedTypesInNamespaceFor(Assembly assembly, string namespacePattern)
        {
            ArrayList list = new ArrayList();
            Type[] types = assembly.GetExportedTypes();
            foreach(Type type in types){
                if (type.FullName.StartsWith(namespacePattern))
                {
                    list.Add(type);
                }
            }
            return (Type[])list.ToArray(typeof(Type));
        }

    }
}

Gruß Tom
 
Es sing insgesammt zwei Projecte.
In einem wird eine Main-Anwendung geschrieben in dem anderen eine Bibliothek mit UserControls. Die Main-Anwendung soll alle KlassenNamen die in der Bibliothek vorhanden sind auslesen (z.B. in eine Listbox). Wenn diese Namen dann angeklickt werden soll eine Instanz erzeugt werden.
 
Da wirst du wohl mit Reflection arbeiten müssen. Ich hab dir mal ein Beispiel angehängt, mit dem du aus einem bestimmten Namespace die einzelnen Typen herausbekommst und feststellen kannst, ob es sich dabei um ein UserControl handelt, oder nicht.

Dieses Beispiel kannst du bei dir nachbauen, musst jedoch die Controls dann noch instanzieren bevor du sie zur Controls.Collection hinzufügen kannst.

Danke für das Beispiel! (habe jetzt VS2005 installiert und das ausprobiert)

Du hast ja bereits im Quellcode festgelegt, welche Klassen du abfragst. Wie macht man das, wenn man die Klassen nicht kennt.

foreach(class myClass in myNamespace)
{
}

es soll dynamisch sein.

Ist es überhaupt möglich?
 
Ich denke, dass ich jetzt genug Material habe auf dem ich weiter selber aufbauen kann! Ich danke allen Beteiligten SEHR

Gruß
d-Stench
 
Zurück