Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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 :mrgreen::
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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class A
{
    void DoSth()
    {
        // child soll jetzt herausfinden wer es instanziiert hat (in diesem Fall ja A)
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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 :D
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 29.03.16 12:29 
:mrgreen: 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 :D)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 29.03.16 18:43 
Ist auch der beste Weg :D

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 :D
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 29.03.16 18:49 
Zitat:
Ist auch der beste Weg :D


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 29.03.16 18:55 
Hallo Palladin007,

WPF verwendet dafür doch ein Property: FrameworkElement.Parent Property.
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 29.03.16 18:56 
Das Factory Pattern wende ich sogar an :mrgreen:. 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 :D (sorry musste jetzt einfach sein)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 29.03.16 19:28 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Palladin007,

WPF verwendet dafür doch ein Property: FrameworkElement.Parent Property.


Ü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 :D (sorry musste jetzt einfach sein)


Ich muss gestehen: Ich habe keine Ahnung, was Du damit sagen willst :D
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 29.03.16 19:54 
Da wird sich wohl jemand erbarmen und Reverse-Engeneering betreiben müssen. Ich machs nicht :D

@Palladin
get rekt m8 war auf die Antwort von Th69 bezogen :D

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 29.03.16 19:57 
Das passiert (intern) mittels AddVisualChild / AddLogicalChild.