Hallo zusammen!
Gleich zu Anfang: Ich habe gesucht, aber leider nichts passendes finden können...alle gefundenen Lösungen haben nicht funktioniert.
Also: Ich habe verschiedene Klassen, die eine Schnittstelle implementieren.
Nun möchte ich folgendes tun: Aus einer Combobox soll der Name eines solchen Typs gewählt werden, danach soll eine Instanz des Typs erzeugt werden.
foreach (string s in TypStrings)
{
System.Reflection.Assembly asm = System.Reflection.Assembly.GetCallingAssembly();
Object obj = asm.CreateInstance(s);
Comparable c = (Comparable)obj; //Comparable ist das Interface
}
resultiert in einer null-Reference bei obj...
Jemand eine Idee?
Greets - SK
Sagte ich schon Danke? Nein? ...kommt noch...
Hallo Schattenkanzler,
hat Deine Typbezeichnung (die aus der ComboBox kommt) auch den vollständigen Namespace mit in der Bezeichnung?
Also bei Form wäre der zu instanziierende Typ dann: "System.Windows.Forms.Form"!
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Machs doch darüber, dass du nicht die Typbezeichnungen in die ComboBox tust, sondern schon die fertigen Type-Objekte. Dann wird dir der Name meiner Meinung nach ohne Namespace gezeigt und kannst alle Typen einwandfrei laden.
Bei deiner Variante mit GetCallingAssembly muss der Typ auch in der Assembly stehen, die die Methode aufgerufen hat, das scheint mir doch ziemlich unsicher zu sein. Wenn überhaupt so, dann frag wenigstens alle in der momentanen AppDomain vorhandenen Assemblys ab...
Versuchs mal mit:
namespace Test
{
public class MyClass
{
}
}
// und woanders
Type myType = Type.GetType("Test.MyClass, assemblyname"); // ohne assemblyname wird das calling assembly verwendet
object obj = Activator.CreateInstance(myType); // oder so ähnlich.
damit kannst du dir das GetCallingAssembly() sparen und hast die möglichkeit den typ auch von anderen assemblies zu laden.
loop:
btst #6,$bfe001
bne.s loop
rts
Ja, die Typenbezeichnung ist vollständig.
Nach diesem Schema: [Projektname].[Ordner].[Klassenname] also z.B. "MeinProgramm.Types.MeinType". Also so, wie's sein sollte...
@0815Coder: Ich habe ja das Problem, dass ich von diesem Punkt aus nicht weiterkomme...ich kann dieses Objekt leider nicht casten...
Nach der Zeile
Comparable c = (Comparable)obj;
bekomme ich eine NullReferenceException (c == null)
Also jetzt noch mal eine etwas konkretere Frage: Wenn ich eine Methode schreiben will, die es mir ermöglichen soll, aus einem bestimmten Namespace alle von einer bestimmten abstrakten Klasse abgeleiteten Klassen instantziieren zu können, wie gehe ich dann vor?
Die Methode mit dem laden des Typs in die ComboBox hat auch nicht funktioniert...vielleicht bin ich auch nur zu doof...
Greets - SK
Sagte ich schon Danke? Nein? ...kommt noch...