none
如何在子对象的方法内获取指定上级对象的信息? RRS feed

  • 问题

  • A类对象内有B类对象(private),B类对象内有C类对象(private)。

    我要怎么在C类对象的方法中获取A类对象的hashcode或字段?如果类少点还好,可以在每个下级的构造函数里面写参数。但如果A类下面多出了其他类的实例,而且又要在这些类的构造函数里写传传A类数据的参数,这样会比较麻烦,怎么在不用构造函数的情况下,下级对象跨越上级对象直接获取上上级对象的某个字段的内容或者上上级对象的hashcode?

    A {
       public string guid;
       private B bean;
    }
    B {
       
       private C bean;
    }
    C {
       
       private void getAInfo()
       {
             //获取A类对象的hashcode或叫guid的字段的内容,或者说获取上上级对象的Hashcode或字段内容,这个要怎么做,才能得到
       }
    }
    
    

    以上只是简化说明,实际上A类对象是一个Wpf窗体类型对象,项目中会存在打开多个A类窗体对象的可能,每个A类窗体对象会用到唯一相应的业务数据来做其他事情的处理,记录在全局dictionary里,用A类窗体中一个叫Guid的字符串类型的字段或者A类窗体对象的hashcode在key,最后在A类对象中的指定的下下级中获取A类中的guid字段或者hashcode作为key来取出全局dictionary里的业务数据来做其他事情

    这个其中获取上级对象的信息那部分要怎么做啊?不想一个一个在构造函数里传参数,比较麻烦。

    2018年9月2日 15:10

全部回复

  • Hi Trian555,

    根据你的描述, 你想从C的一个方法里找到对应的A的实例,你可以先把A的实例都添加到一个集合List<A> lista 里, 然后对List<A> lista进行循环找到对应的A的hashcode。

      public class A
        {
            public string testa { get; set; }
            public B b { get; set; }
        }
        public class B
        {
            public string testb { get; set; }
            public C c { get; set; }
        }
        public class C
        {
            public string testc { get; set; }
            public void fun(List<A> list)
            {
                var result = list.Single(s => s.b.c.testc == testc);
                MessageBox.Show(result.testa.ToString());
            }
                
        }


     private void btn1_Click(object sender, RoutedEventArgs e)
            {
                List<A> lista = new List<A>();
                A a = new A() { testa = "test1", b = new B() { testb = "test1a", c = new C() { testc = "test11a" } } };
                A a1 = new A() { testa = "test2", b = new B() { testb = "test2a", c = new C() { testc = "test22a" } } };
                A a13 = new A() { testa = "test3", b = new B() { testb = "test3a", c = new C() { testc = "test33a" } } };
    
                lista.Add(a);
                lista.Add(a1);
                lista.Add(a13);
    
                B b = new B() { testb = "test1a", c = new C() { testc = "test11a" } };
                B b1 = new B() { testb = "test2a", c = new C() { testc = "test2aa" } };
                B b2 = new B() { testb = "test3a", c = new C() { testc = "test33a" } };
    
                C c = new C() { testc = "test11a" };
                c.fun(lista);
            }

    或者你可以修改一下你的三个类:

    public class A
        {
            public int test { get; set; }
        }
        public class B
        {
            public string test { get; set; }
            public A a { get; set; }
        }
     
        public class C
        {
            public int test { get; set; }
            public B b { get; set; }
        }

    Best Regards,

    Cherry


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年9月3日 9:40
    版主
  • 似乎没有你想要的简便方法。你的需求在于获取调用方信息,目前能获到的信息很少。

    调用方信息:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/caller-information

    调用堆栈:https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stacktrace?view=netframework-4.7.2

    2018年9月29日 13:49