Laden...

Klassen laden und erstellen

Erstellt von Lost-Ha(n)f-PHP vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.133 Views
Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 17 Jahren
Klassen laden und erstellen

Hallo,

ich habe einen NameSpace in einem Projekt ( ggf. später auch eine DLL).
In diesem nameSpace sind x Klassen.
Ich möchte nun Alle Klassen durchgehen und von jeder ein Objekt instanieren.
Dies wird dann in einem Hashtable gespeichert.

Wie kann ich einen NameSpace in einer Schleife druchlaufen und objekte erstellen?
Oder was gibt es für Alternativen?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

M
1.439 Beiträge seit 2005
vor 17 Jahren

Forumssuche=> Reflection

2.921 Beiträge seit 2005
vor 17 Jahren

Genauer: Activator.CreateInstance
z.B. auch:

Referenz nachladen

oder such nach "Plugins" hier im Forum.

Poste die besten Links aus Deinen Suchergebnis passend zum Thema bitte hier, danke.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Lost-Ha[n]f-PHP,

... und Assembly.GetTypes

herbivore

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 17 Jahren

Erst mal vielen Danke,

obwohl ich noch nicht am Ziel bin ^^

Ich habe folgenden Code gefunden, der mir helfen, wird, wenn ich mit DLL's arbeite. Das tue ich im Moment nicht. Jetzt weiß ich nicht, wie ich eien Assembly erstellen kann, bei dem ich nur den NameSpace XXX angebe...


    // Hier will ich nur den NameSpace angeben und ein Assembly bekommen
    // falls das geht und ichdsa nicht irgendwie anders lösen muss
    Assembly assembly = Assembly.LoadFrom(sDllPath);
    foreach (Type t in assembly.GetTypes())
    {
        // Mein Code...
    } 

Ich habe das noch nicht getestet, da ich keine DLL habe. Aber ich denke, das wird so laufen...

Habt ihr da ne gute Idee?

Info wer hierzu mehr wissen will, der sollte einfach dem Link von 'dr4g0n76' folgen!

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Lost-Ha[n]f-PHP,

nach Namesspaces schauen kannst du erst, wenn die DLL schon geladen ist. Es ist m.E. nicht möglich, zu sagen: "lade mir alle DLLs, die diesen Namespace enthalten".

herbivore

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 17 Jahren

Nein Stopp.

Missverständniss!
Ich will zunächst keine DLL laden.
Ich habe einen NameSpace im projekt selbst und aus dem will ich alle Klassen anzeigen lassen.

Die DLL-Geschichte soll erst später oder garnicht kommen.

^^

Danke im Voraus

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

M
1.439 Beiträge seit 2005
vor 17 Jahren

Assembly.GetExecutingAssembly()

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 17 Jahren

Vielen Danke.

Hierbei bekomme ich dann alle Klassen, die das ganze Assembly bietet. Diese habe ich dann über


Assemby ass = Assembly.GetCallingAssembly();
foreach(Type t = ass.GetTypes())
{
    if(t.Namespace = "xxx")
    {
        //... Code ...
    }
}

die benötigten Klassen gefiltert. Geht dies auch irgendwie anders? Alles was ich brauche sind die UserControl-Klassen.

Zudem habe ich noch ein Problem:
ich kann aus dem Type t keine Instance erstellen. Ich habe ein Beispiel mit einem Interface PlugIn gefunden, da aber nicht so ganz durchgeblickt. Könnt ihr mir 'nen Tipp geben, wie ich aus dem Type ein Objekt erstelle?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

2.921 Beiträge seit 2005
vor 17 Jahren

Soweit ich weiss muss das Objekt vom Typ t zumindest einen Default-Konstruktor besitzen, um es mit Activator.CreateInstance erstellen zu können.

Also wenn Deine Klasse z.B. nur so aussieht:


class Blub
{
     public Blub(string _sString)
     {
     }
}

wird es wohl nicht gehen, ausserdem sollte der default Konstruktor public sein:


class Blub
{
     public Blub()
     {
     }
}

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Nur mal so als Frage, wofür benötigst Du das?

Ich wüsste keinen Grund UserControls einfach so anzulegen.

M
1.439 Beiträge seit 2005
vor 17 Jahren

@dr4g0n76
Man kann mit Activator.CreateInstance auch einen Konstruktor mit Parametern aufrufen. Sieh dir die Überladungen mal an. Allerdings muss man hierfür die Parameter kennen, was in diesem Fall wohl nicht zutrifft...

2.921 Beiträge seit 2005
vor 17 Jahren

@marsgk: Deswegen habe ich ja auch geschrieben soweit ich weiss. Hatte momentan keine Möglichkeit das zu überprüfen.

EDIT:

@marsgk: Aber danke für den Hinweis.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 17 Jahren

Hallo,

also um die allgemeine Verwirrung ein bisschen klarer zu gestalten:
Ich habe ein Basisprogramm. In dieses Basisprogramm kann ich verschiedene Module (UserControls) einspielen. Diese sind alle in einer DLL gespeichert. Das Programm soll die DLL auslesen und alle UserControls finden. Das tut es auch. Jetzt soll es danach von jedem UserControl ein Objekt anlegen. Auf diese Objekte kann der Benutzer dann anschließend zugreifen.

So und alle diese UnerControls haben alle einen Contructor ohne Parameter. Ich brauche nur von jedem UserControl ein Objekt.

Nachtrag:
So ich habe gerade mal Activatior.CreateInstance() getestet. Das geht so weit. Aber ich bekomme nur ein Objekt zurück. Wie kann ich nun dieses Objekt in die entsprechende Klasse casten?
Alle UserControls beinhalten die public Attribute ClassName und Description. Wie kann ich darauf zugreifen, wenn ich nur ein Objekt habe? Diese beiden Dinge müsste ich noch wissen ^^

Danke im Voraus.

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Lost-Ha[n]f-PHP,

zum Nachtrag: Das musst du über ein entsprechendes Interface lösen.

herbivore