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
Genauer: Activator.CreateInstance
z.B. auch:
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.
Hallo Lost-Ha[n]f-PHP,
... und Assembly.GetTypes
herbivore
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
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
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
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
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.
Nur mal so als Frage, wofür benötigst Du das?
Ich wüsste keinen Grund UserControls einfach so anzulegen.
@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...
@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.
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
Hallo Lost-Ha[n]f-PHP,
zum Nachtrag: Das musst du über ein entsprechendes Interface lösen.
herbivore