2012-03-24 25 views
0

有什麼辦法如何將屬性從子控件傳播到父 - 所以我可以訪問屬性,如 - Parent.Property1而不是Parent.Child.Property1?我不能使用繼承 - 我的父母不能擴展子類型 - 它從不同的類繼承。傳播屬性到父控制C#

而且我不想爲每個屬性添加代碼,從孩子喜歡家長:

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

也許使用反射 - 這樣的事情?

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

感謝

+1

只需將屬性添加到getters返回子屬性的父類。這是正確的方法,你必須考慮它。太多?揭露孩子是不太合適的方式。 – 2012-03-24 11:19:50

回答

2

在不改變父沒有,但你並不需要繼承的孩子,你可以通過屬性:

在父:

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

然後您也可以通過Parent.Property1訪問Parent.Child.Property1

編輯:當你剛剛編輯你的問題,不想這樣做,然後回到「不,這是不可能的。」!

+0

我寫到我的問題,幾分鐘前,你:) – 2012-03-24 11:14:54

0

那麼,這是你所面臨的非常古老的設計問題 - 在C#中沒有明確的解決方案。
這通常是通過包裝兒童屬性(正如所有人已經指出的那樣)來解決的,這可能很乏味 - 或者b)暴露兒童,而這往往不是最好的方式。
我不會建議反思,因爲你不想那麼做。除了性能(可能沒有注意到,在小應用程序中,但如果你採用這種編碼風格,它很快就會回到你身邊),那隻會導致糟糕的設計,亂碼和難以遵循的例如。你不知道在哪裏和誰可以使用反射來改變其他部分,或者訪問 - 你不希望這樣做到你自己的代碼(在這種情況下),通常只有在強制進入它時,使用其他代碼 - 或者在某些情況下(並不少見,每一段代碼都有某種反映,但有一個很好的理由),即保證你沒有別的辦法,比如跨越通用的非泛型世界,獲得動態屬性等。

話雖如此,
你可以重新設計一些東西,通常以某種其他方式實現某些需要的東西。
例如通過使用接口並間接地暴露一個孩子 - 或者移動事物,以便擁有這些屬性的類在需要使用屬性的時間/地點處於「鏈中」的正確位置。
即很難解釋這一點 - 因爲這需要一個非常具體的情況,然後是一個非常具體的解決方案 - 但通常你總是有某種解決這些問題的「獲勝設計」,並且你面對的事實這樣的問題通常意味着......
1)您可能沒有以最好的方式組織類來解決手頭的問題,並且您不得不嘗試傳播屬性 - 而不是重新安排類之間的責任,
2)或者你只是有這樣的情況,沒有其他方式:)...
...希望這可以幫助一些