C#如何从类函数中访问兄弟类?

时间:2018-12-12 23:35:46

标签: c# .net oop

我有一个类似以下代码的代码。我仅用提出问题的必要条件简化了它。

我有一个Parent类,其中包括Item1类,Item2类,Item1_to_Item2_relationship类。我必须保留此结构的原因与该问题无关。

如何从Item2访问Item1中的值? 该代码更好地说明了需要做什么。

--exclude excluded

此刻,我必须纠正一个静态函数,该函数接收一个Parent参数并在那里执行逻辑。但我相信应该有一个更好,更直观的方法。如何使以上代码起作用?

4 个答案:

答案 0 :(得分:0)

最快和最简单的方法是将parent传递到itemX需要从itemY访问属性的函数中。

例如:

class Item1
{
    public string id;
    public string id_alt;
    public string item1_code;
    public Item1()
    {
        id = "";
        item1_code = "";
    }
}
class Item2
{
    public string id;
    public string id_alt;
    public Item2()
    {
        id = "";
    }
    public void AccessItem1Prop(Parent parent) {
        string item1ID = parent.items1[0].id;
    }
}

您还可以将parent传递给单个项目构造函数,并将其作为对象属性附加到该项目,但是如果您可以简单地保持环境整洁,则我会避免这种方法。

答案 1 :(得分:0)

如其他答案中所述,您可以直接访问它。既然您正在维护一种关系,那么我想您想通过这种关系来实现

            var test = new List<String>();            
            foreach (Item2 my_item2 in parent.items2)
            {
                foreach (var item in parent.Item1_to_Item2_Relationships)
                {
                    //implement your own equality comparision if it should be differernt
                    if (item.item2.id_alt == my_item2.id)
                    {
                        test.Add(item.item1.item1_code);
                    }
                }
            }

一些要点:

  1. 您正在处理列表循环和嵌套循环, 方法不是最好的。
  2. 为提高性能,关系数据结构应为 明智地选择,是否有可能将其转换为Dictionary,因此 提供更快的查找时间。
  3. 该代码当前将添加空白字符串,因为您没有在关系中添加该代码,但是您始终可以使用id搜索对象,这意味着在列表中进行另一次搜索,这就是我说您可能想要的原因更改基础数据结构。
  4. 如果单个对象的项目代码是主键,则最好也将单个对象存储在字典中。

答案 2 :(得分:0)

我不喜欢代码的结构...但这是简单的答案。

您要将两种不同的商品类型添加到两个不同的收藏集中。

您正在创建一个关系项,该关系项基于id关联两者。

尽管您的代码尖叫声可以帮助您实现一个合理的想法,并且是联系诸如使用数据库之类的项目的好方法。

我们可以使用Linq轻松完成此操作,但我宁愿更贴近您如何编写问题。

首先像您所做的那样迭代您的项目,然后迭代您的关系。根据ID比较,您然后迭代其他项,并根据最终ID比较获得答案。

foreach (Item2 my_item2 in parent.items2)
{
    foreach (Item1_to_Item2_Relationship relatedItem in parent.Item1_to_Item2_Relationships)
    {
        if (my_item2.id == relatedItem.item2.id_alt)
        {
            foreach (Item1 item1 in parent.items1)
            {
                if (relatedItem.item1.id_alt == item1.id)
                {
                    Console.WriteLine(item1.item1_code);
                }
            }
        }
    }
}

//Outputs
//CODE_01
//CODE_02

答案 3 :(得分:-1)

'做到这一点'

var i1 = new Item1();
var i2 = new Item2();

i1.id = i2.id;

现在其他人会争辩说,您应该使用属性而不是公共字段。但是,目前您拥有的东西可以让您完全按照自己的意愿做。