将属性传播到父控件C#
本文关键字:控件 属性 传播 | 更新日期: 2023-09-27 18:28:57
有没有办法将属性从子控件传播到父控件中,这样我就可以访问像-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()}
}
感谢
在不更改父项的情况下,但不需要继承子项,只需传递属性:
在父级中:
public object Property1
{
get { return Child.Property1; }
set { Child.Property1 = value; }
}
然后您也可以通过Parent.Property1
访问Parent.Child.Property1
。
编辑:当你刚刚编辑时,你质疑不想那样做,然后回到"不,这是不可能的"!
好吧,这是你面临的一个非常古老的设计问题——在C#中没有明确的解决方案
这通常是通过封装子属性(正如所有人已经指出的那样)来解决的,这可能很乏味——或者b)公开子属性,这通常不是最好的方法
我不会建议你反思,因为你真的不想这么做。撇开性能不谈(在小型应用程序上可能不会注意到这一点,但如果你采用这种编码风格,它很快就会再次困扰你),这只会导致糟糕的设计、混乱的代码和难以遵循的问题,例如,你不知道在哪里和谁可以使用反射来更改其他部分或访问-你不想对你的"自己的代码"(在这种情况下)这样做,只有在被迫使用的情况下,使用其他代码-或者在某些情况下(并非罕见,每一个较大的代码都有某种反映,但有充分的理由),即你没有其他方式来做事情,比如穿越通用的非通用世界,获得动态属性等。
话虽如此,
你可以重新设计一些东西,通常通过其他方式来实现你想要的东西
例如,通过使用接口并间接公开子对象,或者四处移动对象,使拥有属性的类在需要使用属性的时间/位置处于"链中"的正确位置
也就是说,很难解释这一点,因为这需要一个非常具体的场景,然后是一个非常特定的解决方案,但通常情况下,你总是有某种"获胜的设计"来解决这些问题,而你面临这样一个问题的事实通常意味着
1) 您可能没有以最佳方式组织类来解决当前的问题,并且您被迫尝试传播属性,而不是重新安排类之间的责任,
2) 或者你只是遇到了一种没有其他办法的情况:)
…希望这对有所帮助