Autor |
Beitrag |
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 28.03.16 19:42
Hey @ll,
ich suche einen (halbwegs) eleganten Weg um das Objekt das einen Typ instanziiert von diesem Typ aus zu ermitteln ohne dass das Objekt bekannt ist.
Und jetzt nochmal verständlich :
Ich habe ein Typ A und ein Typ B. Ein Objekt vom Typ A erzeugt intern irgendwo ein Objekt vom Typ B. Gibt es einen weg, dass das Objekt B über die Existenz von Objekt A informiert wird, aber ohne das Objekt im Konstruktor zu übergeben.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| class A { void DoSth() { B child = new B(this) } } |
Die markierte Stelle wollte ich vermeiden. Ich dachte an sowas in der Art CallerMemberNameAttribute, nur halt für das ganze Objekt statt für den Membernamen.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 28.03.16 19:50
Nein es gibt kein Konzept von Parent, Owner, Creator oder sonstwas zwischen normalen Klassen. Wenn du sowas brauchst musst du es ausprogrammieren.
Für diesen Beitrag haben gedankt: C#
|
|
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Mo 28.03.16 19:55
Ja das dachte ich mir schon... schade.
Danke für die fixe Antwort.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 28.03.16 22:51
Wenn Du die Instanz nicht brauchst, dann kannst Du über den StackTrace heraus finden, in welchem Member der Aufruf statt gefunden hat.
Ob man die Instanz darüber auch heraus finden kann, weiß ich nicht.
Aber überleg dir das gut, das ist langsam und schreit für mich nach ganz schlechtem Stil
|
|
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Di 29.03.16 12:29
Ja aus diesem Grund wollte ich StackTrace und Reflection vermeiden. Ich werds wohl einfach über den Konstruktor machen (wie ich oben gesagt hab dass ich es nicht tun will )
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Di 29.03.16 18:43
Ist auch der beste Weg
Oder Du findest raus, wie WPF es macht, die machen das weder über den Konstruktor noch über eine Property.
So auf die Schnelle hab ich aber nicht ganz den Überblick gefunden, wie das da abläuft
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 29.03.16 18:49
Zitat: | Ist auch der beste Weg |
Der ~beste~ Weg wäre erst gar nicht new zu brauchen. Also irgendeines der vielen Factory Patterns am Start zu haben das einem ein neues Object gibt mit irgendwelchen darauf wirkenden Strategien.
Dann hat man das auch soweit zentralisiert das man keine Angst haben muss einen neuen Konstruktorparameter an allen möglichen Stellen hinzufügen zu müssen der einem den schönen Code ~kaputt~ macht.
|
|
Th69
Beiträge: 4782
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 29.03.16 18:55
Hallo Palladin007,
WPF verwendet dafür doch ein Property: FrameworkElement.Parent Property.
|
|
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Di 29.03.16 18:56
Das Factory Pattern wende ich sogar an . Vielleicht gibt's ja auch ne bessere Lösung für mein eigentliches Vorhaben. Es soll nämlich nur ein Progress Reporter an ein Objekt angehängt werden, welches ein Interface implementiert. Ich könnte natürlich auch den Progress Reporter ins interface packen aber so ganz elegant erscheint mir das auch nicht...
// Edit
Get rekt Palladin (sorry musste jetzt einfach sein)
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 29.03.16 19:17
Nun ja wenn das Progress Reporter Object nur von deiner Factory setzbar ist wäre mir eher egal ob per Konstruktor oder Property Injection im Object landet. Allgemein würde ich es per Property vorziehen nur wenn ich das Object auch schon im Konstruktor brauche dann würde ich das über den Konstruktor machen.
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Di 29.03.16 19:28
Über eine Property greifst Du darauf zu, ja, gesetzt wird es aber irgendwie anders. Hab erst gedacht, es wäre ein internal set, war aber falsch gedacht.
Zitat: | Get rekt Palladin (sorry musste jetzt einfach sein) |
Ich muss gestehen: Ich habe keine Ahnung, was Du damit sagen willst
|
|
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Di 29.03.16 19:54
Da wird sich wohl jemand erbarmen und Reverse-Engeneering betreiben müssen. Ich machs nicht
@Palladin
get rekt m8 war auf die Antwort von Th69 bezogen
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
Th69
Beiträge: 4782
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 29.03.16 19:57
Das passiert (intern) mittels AddVisualChild / AddLogicalChild.
|
|