Pass aktuellen Objekttyp in Basis-Konstruktor aufrufen
Wie kann ich schnappe mir den Type
von der geerbten Klasse, und übergeben Sie es in die Basis-Konstruktor von der Klasse geerbt? Siehe das code-Beispiel unten:
//VeryBaseClass is in an external assembly
public abstract class VeryBaseClass
{
public VeryBaseClass(string className, MyObject myObject)
{
}
}
//BaseClass and InheritedClass are in my assembly
public abstract class BaseClass : VeryBaseClass
{
public BaseClass(MyObject myObject) :
base(this.GetType().Name, myObject) //can't reference "this" (Type expected)
{
}
}
public class InheritedClass : BaseClass
{
public InheritedClass(MyObject myObject)
{
}
}
Die Linie base(typeof(this).Name, myObject)
funktioniert nicht, da kann ich nicht Referenz this
doch, da das Objekt noch nicht fertig konstruieren und daher nicht vorhanden ist.
Ist es möglich zu greifen, die Type
von der aktuell Bau-Objekt?
EDIT:
Korrigiert die Stichprobe orsogufo vorgeschlagen, aber funktioniert immer noch nicht, wie this
ist nicht definiert.
EDIT 2:
Nur um zu klären, möchte ich am Ende mit "InheritedClass"
weitergegeben werden, in der VeryBaseClass(string className, MyObject myObject)
Konstruktor.
- Warum wollen Sie dies tun? Ein Konstruktor sollte nicht egal, ob es aufgerufen wird, ist die Instanzierung der eigenen Klasse oder einer abgeleiteten Klasse.
- Ich denke, Sie sind fehlt den Punkt. Die externe assembly, definiert die Basis-Klasse des Frameworks, die ich verwenden, benötigt die string-Darstellung der Klasse selbst übergeben werden dem Konstruktor übergeben. Bisher habe ich es immer aufgeschoben, als man erwarten würde (als string), aber ich würde es vorziehen, wenn es funktionieren würde, es zur Laufzeit für geistige Gesundheit Willen.
- Oh ich sehe, es ist nicht deine Klasse. Ich denke immer noch, es ist eine schlechte Sache, die es interessiert 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ah Hah! Ich habe eine Lösung gefunden. Sie können es mit generics:
Ich habe genau die gleichen Schmerzen, bevor Sie nun in die Google Wave-Roboter .NET-API, wo ich wollte, um den Konstruktor übergeben, einige Werte basierend auf den Attributen. Sie können einen Blick auf meine Lösung in den code für die abgeleiteten Typ und die base Typ. Im Grunde gebe ich eine Stellvertretung an der Basis-Konstruktor, und rufen Sie dann das delegate übergeben, die in "dieser" die Stellvertretung. Also in deinem Fall müsstest du:
und
Ist es wirklich hässlich, aber es funktioniert.
EDIT: Dieser Ansatz funktioniert nur, wenn Sie ändern, können Sie Ihre Basis-Klasse-Konstruktor wie gezeigt; wenn Sie nicht können, ich bin mir nicht sicher, es ist eigentlich machbar an alle 🙁
@this
vor, und scheint zu verwirren Google. Tut es nur erlauben, eine Methode, die ohne Parameter aufgerufen und automatisch auf das aktuelle Objekt? (das ist, wie ich es sehe)Argument '1': cannot convert from 'method group' to 'string'
Ich glaube, ich sollte hier erwähnen, dass, obwohl mein Beispiel zeigt nur die parameter verwendet, die von der Basisklasse, meine eigentliche Implementierung verwendet ein paar mehr. Ich werde zu aktualisieren, die Frage zu reflektieren.Tut GetType().Namen nicht funktioniert?
this
im Konstruktor chain-argument" - da kann man nicht immer schieben die Funktionalität bis der vererbungsstruktur.VeryBaseClass
nicht zu diesem Zeitpunkt geändert werden. Ich kann nur ändern, die anderen zwei Klassen 🙁Eine mögliche Lösung:
this
ist nicht definiert.Wenn die Fähigkeit zur Ermittlung der geerbten Klasse Typ zur Laufzeit wichtiger ist als die Leistung, die Sie ergreifen können, einen Blick auf den StackTrace zu sehen, wo der Konstruktor aufgerufen wird, aus. Möglicherweise müssen Sie code in weitere Annahmen, die beim aufrufen GetInheritedClassName in diesem Beispiel:
Kann ich nicht denken, eine großartige Möglichkeit, um dynamisch den Namen der geerbten Klasse ohne Auswirkungen auf die Leistung. Ich begreife ist, was Sie vermeiden wollte, aber wenn ich brauchte, um Anruf ein 3rd-party-Versammlung mit diesen Anforderungen würde ich nur verlangen, dass jeder Klasse geben seine eigene Art:
Noch eine andere option...
BaseClass
Konstruktor von derInheritedClass
.