2012-03-24 6 views
0

Gibt es eine Möglichkeit, Eigenschaften von untergeordneten Steuerelement in übergeordnete Eigenschaften zu propagieren - so kann ich auf Eigenschaft wie zugreifen - Parent.Property1 anstelle von Parent.Child.Property1? Ich kann keine Vererbung verwenden - mein Elternteil kann kein Kindtyp sein - erbt von einer anderen Klasse.Eigenschaften an übergeordnetes Steuerelement weitergeben C#

auch nicht Ich möchte Code hinzufügen, für jede Eigenschaft von Kind zu Eltern wie:

public object Property1 
{ 
    get{ return Child.Property1; } 
    set{ ChildProperty1 = value; } 
} 

Vielleicht Reflexion mit - so etwas wie das?

public PropertyInfo[] Properties 
{ 
    get{ return Child.GetType().GetProperties(); } 
    set{ Child.GetType().GetProperties().SetValue() = value.GetValue()} 
} 

Dank

+1

Fügen Sie einfach Eigenschaften zur übergeordneten Klasse hinzu, deren Getter die untergeordnete Eigenschaft zurückgibt. Das ist der richtige Weg, du musst darüber nachgedacht haben. Zu viele? Das Entlarven des Kindes ist der nicht so richtige Weg. –

Antwort

2

Ohne die Eltern nicht zu ändern, aber Sie müssen das Kind nicht erben, können Sie einfach durch das Grundstück passieren:

Im parent:

public object Property1 
{ 
    get { return Child.Property1; } 
    set { Child.Property1 = value; } 
} 

Dann können Sie auf Parent.Child.Property1 auch von Parent.Property1 zugreifen.

EDIT: Wie Sie gerade bearbeitet haben Sie Frage, um es nicht so zu tun, dann zurück zu "Nein, es ist nicht möglich."!

+0

Ich schrieb es in meine Frage, wenige Minuten vor dir :) –

0

Nun, das ist das sehr alte Designproblem, vor dem Sie stehen - es gibt keine klare Lösung in C#.
Das wird normalerweise gelöst, indem Kindeigenschaften (wie bereits von allen angegeben) umhüllt werden, was mühsam sein kann - oder b) ein Kind aussetzen kann, was nicht oft der beste Weg ist.
Ich würde nicht die Reflexion vorschlagen, wie Sie das wirklich nicht wollen. Leistung beiseite (vielleicht nicht auf kleine apps, aber wenn Sie diese Art der Codierung übernehmen würde es zurück zu verfolgen Sie bald), das ist nur in einem schlechten Design, chaotisch Code und schwer zu folgen, z. Sie wissen nicht, wo und wer Reflektionen verwenden könnte, um einen anderen Teil zu ändern oder um darauf zuzugreifen - Sie möchten das nicht mit Ihrem eigenen Code tun (in diesem Fall), nur normalerweise, wenn Sie dazu gezwungen werden Code - oder in einigen Situationen (nicht selten, jeder größere Code-Code hat eine Art von Reflexion, aber aus einem guten Grund), die dies rechtfertigt, dh Sie haben keine andere Möglichkeit, Dinge zu tun, wie die generische nicht-generische Welt zu kreuzen, dynamische Eigenschaften usw. erhalten

Having gesagt,
Sie konnten einige Sachen gewöhnlich neu entwerfen, um etwas wünschenswertes auf eine andere Art zu erzielen.
Zum Beispiel durch Verwendung von Schnittstellen und indirektes Freilegen eines Kindes - oder Verschieben von Dingen, so dass die Klasse, der die Eigenschaften gehören, an der richtigen Stelle "in der Kette" ist, wenn/wo Sie Eigenschaften verwenden müssen.
Das ist schwer zu erklären - da dies ein sehr spezifisches Szenario erfordert und dann eine sehr spezifische Lösung -, aber normalerweise haben Sie immer ein 'gewinnendes Design', das diese Probleme und die Tatsache, dass Sie konfrontiert sind, löst ein solches Problem bedeutet normalerweise ..
1) Sie haben möglicherweise Klassen nicht auf die beste Weise für das vorliegende Problem organisiert, und Sie sind gezwungen zu versuchen, die Eigenschaften zu propagieren - anstatt die Verantwortlichkeiten zwischen den Klassen neu zu ordnen,
2) oder du hast einfach so eine Situation, dass es keinen anderen Weg gibt:) ... ... hoffe das hilft etwas