2012-03-24 27 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)或者你只是有这样的情况,没有其他方式:)...
...希望这可以帮助一些