如何获取父对象? 类似VisualTreeHelper.GetParent(txtblock)

慧眼识狗熊 2017-05-16 05:27:06
现有项目有类A,B,C,D,E,F,G...
其中
class A{ B b;}
class B{C c;}
class C{D d;}
...
以此类推。
项目中一般只有一个A对象a。 所有获取数据都是通过a.b.c.d等层级调用获取。

public void Fun(D d){...}//项目限制,改函数不行
现在的情况是一个函数中传入参数只有d,由于功能修改需要知道它的父级c,怎么获取声明它这个实例对象c。
就类似VisualTreeHelper和LogicalTreeHelper的GetParent。

我知道它的父级类型是C,但是我获取不到这个c对象。 有没有类似反查的功能?

ps:不要说声明全局变量,因为真正代码中这个层次很低,实际的c对象已经有好多个了。
如果觉得我说的不清楚请再问吧。
...全文
434 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
慧眼识狗熊 2017-05-17
  • 打赏
  • 举报
回复
引用 12 楼 hanjun0612 的回复:
什么叫父类。。。有继承关系的才是啊。。。。你只是c种有b对象的实例而已。但他们并不是继承关系
只是这么描述而已,上层数据对象,visualtreehelper之类的不也用getparent么。能理解问题就好了。
引用 13 楼 hjq624779687 的回复:
1、强行遍历,声明B的时候遍历A里面有没有B。。。(感觉有点奇怪)2 2、你有child了,声明个parent吧。。。
已经在做了,这个问题提出来想看看是不是有我不知道的一些方法可以实现这个怪怪的需求。
慧眼识狗熊 2017-05-17
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
反射可以搞定。
我现在已经知道d的‘父类型’是C了,就是得不到这个实例c。 反射可以获取属性、方法、declaringtype。 或者可以CreateInstance但也是个新对象了。
引用 11 楼 From_TaiWan 的回复:
添加一个属性吧,否则不好解决 实质上,它们之间并不是继承关系,你可以在需要变动的类中加入属性,这样对其他类和设计影响不大 至于再以后的维护问题,只能写文档说明了
嗯,已经在这么干了。 实际上一个对象可以赋值给多个实例中的引用,从这点来看好像确实不太好获取,最多可以获取到所有引用的实例,然后再筛选
夏天的枫 2017-05-17
  • 打赏
  • 举报
回复
1、强行遍历,声明B的时候遍历A里面有没有B。。。(感觉有点奇怪)2 2、你有child了,声明个parent吧。。。
正怒月神 2017-05-17
  • 打赏
  • 举报
回复
什么叫父类。。。有继承关系的才是啊。。。。你只是c种有b对象的实例而已。但他们并不是继承关系
秋的红果实 2017-05-17
  • 打赏
  • 举报
回复
添加一个属性吧,否则不好解决 实质上,它们之间并不是继承关系,你可以在需要变动的类中加入属性,这样对其他类和设计影响不大 至于再以后的维护问题,只能写文档说明了
慧眼识狗熊 2017-05-17
  • 打赏
  • 举报
回复
引用 2 楼 bloodish 的回复:
好特别的需求,你想从一个对象的实例获取声明这个实例的所属类的实例,反射也做不到。 除非是这个对象的实例有个直接的所属类的属性,在实例化这个对象的时候就预先设置好. 类似于d.Parent = c;
现在就是D中没有类似parent属性,看来是没啥办法了。
慧眼识狗熊 2017-05-17
  • 打赏
  • 举报
回复
引用 4 楼 liu824403167 的回复:
允许D类型吗 如果只允许在这个方法public void Fun(D d){...} 通过d来获取C吗 那是不可能的,如果只有六个可能类型的话用if判断吧
在D里增加C的引用么? 这个确实可以,但 实际上d对象有几万个加个引用要到处改。
慧眼识狗熊 2017-05-17
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
A 中有个 B 的实例,就说 A 是 B 的父对象。这是什么逻辑
就是这么个说法
xuzuning 2017-05-16
  • 打赏
  • 举报
回复
A 中有个 B 的实例,就说 A 是 B 的父对象。这是什么逻辑
xuggzu 2017-05-16
  • 打赏
  • 举报
回复
获取所在类名称,函数等都可以做到,但实例必须有直接关联操作才能获取,楼主的伪代码里根本看不出此类关联操作,只有个下级类实例而已。
liu824403167 2017-05-16
  • 打赏
  • 举报
回复
允许修改D类型吗 如果只允许在这个方法public void Fun(D d){...} 通过d来获取C的话 那是不可能的,如果只有六个可能类型的话用if判断吧
liu824403167 2017-05-16
  • 打赏
  • 举报
回复
允许D类型吗 如果只允许在这个方法public void Fun(D d){...} 通过d来获取C吗 那是不可能的,如果只有六个可能类型的话用if判断吧
bloodish 2017-05-16
  • 打赏
  • 举报
回复
找了个stackoverflow的回答,跟我的意思差不多 http://stackoverflow.com/questions/13072077/c-sharp-get-parent-from-chlid-instance
bloodish 2017-05-16
  • 打赏
  • 举报
回复
好特别的需求,你想从一个对象的实例获取声明这个实例的所属类的实例,反射也做不到。 除非是这个对象的实例有个直接的所属类的属性,在实例化这个对象的时候就预先设置好. 类似于d.Parent = c;
  • 打赏
  • 举报
回复
反射可以搞定。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧