Ich habe eine Engine erstellt, die Plugins von Drittanbietern (DLLs) akzeptiert, die eine Schnittstelle implementieren.Ist es möglich, eine Instanz einer Klasse zu erstellen, ohne irgendeinen Code von der Klasse auszuführen? (keine Ctor, keine Feldinitialisierungen)
Da ich keine Kontrolle über den Code habe, der eingesteckt wird, möchte ich in der Lage sein, eine bestimmte Methode (von der Schnittstelle) von der richtigen Klasse auszuführen (GetTypes-Schleife, bis ich die Interface-Klasse finde).
Da jeder kann schön Konstruktorcode erstellen, die auf Activator.CreateInstance ausführt, kann ich das lösen von FormatterServices.GetUninitializedObject verwenden. Aber das hilft nicht, wenn Code für Felder in der Klasse initialisiert wird.
public class myclass : myinterface {
public someotherclass name = new someotherclass()
public myclass() {
//Unknown code
}
//I only want this run.
public string MyProperty{
get {
return "ANiceConstString";
}
}
}
Das Problem mit beiden Möglichkeiten (CreateInstance/GetUninitializedObject) ist, dass der Konstruktor von someotherclass wird ausgeführt werden.
Bevor Sie beginnen, analysieren meine Bedürfnisse. Dies wird nur bei der Initialisierung der Engine ausgeführt, um eine Reihe von Standardwerten zu erhalten. Wenn dieses get'er auf anderen initialisierten Werten beruht, wird das "plugin" als fehlgeschlagen markiert, da kein gültiger Wert zurückgegeben wird. Wenn nicht als fehlgeschlagen gekennzeichnet, wird die Klasse später ordnungsgemäß mit Activator.CreateInstance() geladen.
Also bleiben Sie bei dieser Frage: Unterstützt .Net jede Möglichkeit, eine 100% nicht initialisierte Klasse zu erstellen?
Update für die Antworten. Ich habe das getestet, bevor ich meine Frage gestellt habe.
Für die Antwort, dass einige Klasse nicht laufen wird, habe ich bereits getestet, und es wird ausgeführt, wenn statisch.
public class myclass : myinterface {
static Tutle test;
public myclass() {
test = new Tutle();
}
public class Tutle {
public Tutle() {
MessageBox.Show("RUN!");
}
}
}
CreateInstance zeigt die Messagebox an. GetUninitializedObject nicht.
public class myclass : myinterface {
static Tutle test = new Tutle();
public myclass() {
}
public class Tutle {
public Tutle() {
MessageBox.Show("RUN!");
}
}
}
CreateInstance zeigt die Messagebox an. GetUninitializedObject zeigt die Nachrichtenbox an.
Gibt es eine Möglichkeit, statische Feldinitiatoren und -tore zu umgehen?
Wenn Sie wirklich nicht, eine Objektinstanz erstellt werden soll, es klingt wie Sie stattdessen eine * statische * Eigenschaft möchten. Ja, es bedeutet, dass Sie es nicht in einer Schnittstelle angeben müssen ... aber Sie verwenden bereits eine Reflexion, so dass Sie einfach überprüfen können, ob alle Typen die entsprechende Eigenschaft besitzen. Oder wenn Sie wissen, dass der Eigenschaftswert immer eine Konstante sein soll, benötigen Sie stattdessen möglicherweise ein benutzerdefiniertes Attribut. –
Wenn Sie keine Kontrolle über den Code haben, der ausgeführt wird, können Sie in Erwägung ziehen, diesen Code in einer separaten Anwendungsdomäne mit eingeschränkten Berechtigungen auszuführen. Dies könnte eine Alternative zum Erstellen eines nicht initialisierten Objekts sein. –