将属性传播到父控件C#

时间:2012-03-24 10:58:44

标签: c# winforms properties controls propagation

有没有办法如何将属性从子控件传播到父级 - 所以我可以访问属性 - Parent.Property1而不是Parent.Child.Property1?我不能使用继承 - 我的父母不能扩展子类型 - 它继承自不同的类。

另外,我不想为每个属性添加从子级到父级的代码,如:

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()}
}

由于

2 个答案:

答案 0 :(得分:2)

如果不更改父级,但您不需要继承子级,则可以直接通过该属性:

在父母:

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

然后,您也可以Parent.Child.Property1访问Parent.Property1

编辑:正如你刚刚编辑的那样,你不想这样做,然后回到“不,这是不可能的。”!

答案 1 :(得分:0)

嗯,这是你所面临的一个非常古老的设计问题 - 在C#中没有明确的解决方案。
这通常是通过包装子属性(如所有人已经指出的)来解决的,这可能是乏味的 - 或者b)暴露孩子,这通常不是最好的方式。
我不建议反思,因为你不想那样做。除了性能之外(可能没有注意到在小型应用程序上,但如果你采用这种编码风格,它很快就会困扰你),这只会导致设计糟糕,代码混乱并且很难遵循,例如:你不知道在哪里以及谁可以使用反射来改变其他部分,或访问 - 你不想对你自己的代码(在这种情况下)这样做,只有在被强制进入它时,才使用其他代码 - 或者在某些情况下(并不罕见,每一个较大的代码都有某种反射,但有充分的理由)保证,即你没有别的办法,比如跨越通用的非通用世界,获得动态属性等。

话虽如此,
你可以重新设计一些东西,通常以其他方式实现一些可取的东西 例如。通过使用接口和间接暴露子项 - 或移动东西,以便拥有属性的类在链中的正确位置'当/您需要使用属性时。
即很难解释这一点 - 因为这需要一个非常具体的场景,然后是一个非常具体的解决方案 - 但通常你总是有某种“获胜设计”来解决这些问题,而且你面对的是这样一个事实。问题通常意味着..
1)您可能没有以最佳方式组织课程来解决当前的问题,并且您不得不尝试传播属性 - 而不是重新安排类之间的职责, 2)或者你只是有这种情况,除此之外别无他法:)...
...希望这有助于一些