【问题标题】:Getting the type of another nested class from the same "parent" class从同一个“父”类中获取另一个嵌套类的类型
【发布时间】:2013-12-25 02:14:24
【问题描述】:

我在学习编程时第一次尝试创建命名空间。我希望有一种方法可以解决我遇到的不是特别混乱的问题,但本质上我有一个类对象,它保留两个嵌套类对象的两个字典。我需要能够将 NestedClassA 的字典传递给 NestedClassB 或允许 NestedClassB 以某种方式访问​​它...这是我正在尝试做的一个示例:

namespace MyFirstNamespace 
{
    public class BossClass 
    {
        public Dictionary<int, NestedClassA> DictionaryA = new Dictionary<int, NestedClassA>();
        public Dictionary<int, NestedClassB> DictionaryB = new Dictionary<int, NestedClassB>();

        public class NestedClassA { ...arbitrary class definition... }

        public class NestedClassB 
        {
            public Dictionary<int, NestedClassA> PassedDictionary;

            public NestedClassB() { }

            public NestedClassB(Dictionary<int, NestedClassA> tempDic))
            {
                PassedDictionary = tempDic;
            }
        }


        public BossClass() { ... arbitrary constructor ... }

        ...arbitrary dictionary population methods...

        function void CreateAClassBInstance()
        {
            DictionaryB[n] = new NestedClassB(n, DictionaryA);
        }
    }
}

我的问题似乎是我无法在“NestedClassB”中对“NestedClassA”进行类型转换,因为它无法识别类型。是否可以访问 B 中的“NestedClassA”类型?我试过的都没有用。我是否必须传递“BossClass”的实例才能通过“Dictionary&lt;int, MyFirstNamespace.BossClassInstance.NestedClassA&gt;”引用类型?

任何帮助将不胜感激。需要明确的是,我希望将一个 REFERENCE 变量传递给所有 NestedClassA 成员的 Dictionary 的 NestedClassB,以便它们可以被 NestedClassB 操作。不可能是克隆。我知道这似乎是荒谬的实现,但对于我正在尝试做的事情,如果可能的话,它似乎是最有效的。

编辑:也许我根本不应该嵌套它们,但这会使它们更容易序列化,这就是我真的想这样做的原因。

(编辑 - 修正了我忘记在构造函数之前插入“public”的错字。)

【问题讨论】:

  • 建议:当你开始编程时,我建议你一次尝试一件新事物。命名空间,好的,嵌套,没必要。留到以后再说吧。
  • 在我看来,这不是一个特别不精确的问题。我敢肯定,如果没有嵌套类,我可以使这项工作完美无缺,而且,从此以后,我不会在这里问这个问题,因为否则我会尝试做的事情将是我已经知道该怎么做的事情。我似乎无法做的是让 NestingClassB 识别 NestingClassA 的类型。我不确定在类定义列表的顶部键入“namespace xxxx”是否过于繁重,以至于我无法了解是否可以交叉引用嵌套类。
  • 我目前的看法是它需要直接访问“BossClass”的实例化,因为 BossClass 不是静态的。我希望有办法解决这个问题,但如果绝对必要,我可以从调用解决方案中传递实例。

标签: c# parameter-passing nested-class


【解决方案1】:

您的 NestedClassB 实现似乎没有什么特别的问题,只是如果您希望实例化 NestedClassB 的实例,您需要公开您的构造函数。默认情况下,在 .Net 中,对象是通过引用函数参数来传递的,因此您将在 NestedClassB 中拥有相同的 Dictionary 实例。

这是调整后的类:

    public class NestedClassB 
    {
        private readonly Dictionary<int, NestedClassA> _PassedDictionary;

        public NestedClassB() { }

        public NestedClassB(Dictionary<int, NestedClassA> tempDic) {
            _PassedDictionary = tempDic;
        }

        public Dictionary<int, NestedClassA> PassedDictionary {
            get { return _PassedDictionary; }
        }
    }

请注意,我将 PassedDictionary 更改为属性而不是成员变量。大多数序列化程序会忽略成员变量,只序列化属性。如果需要反序列化,则需要从私有成员变量中移除 readonly 并添加一个 setter。

代码 sn-p 底部的函数看起来不正确。你会想让它看起来像:

private void CreateAClassBInstance()
{
    DictionaryB[n] = new NestedClassB(DictionaryA);
}

【讨论】:

  • 对不起,这只是我输入的一个错误。构造函数在实际脚本中都有公共,我只是试图为我的问题编写一个模板. NestingClassB 中的“字典”声明表明“NestingClassA”不是“NestingClassB”上下文中可识别的“类型或命名空间”。
  • 关于您编写​​的最终代码块,是的,这是不正确的。我的意思是说: NestedClassB tempClass = new NestedClassB(DictionaryA); DictionaryB.Add(n, NestedClassB) 无论如何,因为这不是我拥有的实际代码(这是 500 行,因此,最好省略并替换为指示我的一般问题的模板])并且该代码在其他方面是正确的,除非我的嵌套类困境。我将尝试将“BossClass”的实例化传递给“NestedClassB”。作为 C# 的新手,假设问题没有引用实例,我不知道“this”关键字。
【解决方案2】:

对于任何尝试这样做的人:传递包装类的实例对于嵌套类访问包装类的方法或变量是必要的。这可以通过“this”关键字来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2022-12-09
    相关资源
    最近更新 更多