在对象初始值设定项中引用要初始化的对象的其他属性

本文关键字:对象 引用 初始化 其他 属性 | 更新日期: 2023-09-27 18:37:17

创建对象时:

var customers = new Customers
{
    Persons = new List<Person>
    {
        new Person { CustomId = "111" },
        new Person { CustomId = "222" }
    },
    Organizations = new List<Organization>
    {
        new Organization { CustomId = "333" }
    },
    Keys = new HashSet<string> { "111", "222", "333" }
};

我想更改密钥的初始化以使用来自 Person[0] 的先前值。自定义ID,人[1]。自定义ID和组织[0]。自定义 ID。(不像这样的硬编码"111"、"222"、"333")

在这种类型的初始化中,有没有一种简单的方法可以做到这一点?我可以在客户初始化后添加密钥,如下所示:

foreach (var person in customers.Persons)
{
    customers.Keys.Add(person.CustomId);
}
foreach (var org in customers.Organizations)
{
    customers.Keys.Add(org.CustomId);
}

但是我无法在与客户相同的初始化中从个人和组织属性创建密钥?

在对象初始值设定项中引用要初始化的对象的其他属性

不,你不能那样做。

您可以先创建集合,然后连接选定的键:

var persons = new List<Person>
{
    new Person { CustomId = "111" },
    new Person { CustomId = "222" }
};
var organizations = new List<Organization>
{
    new Organization { CustomId = "333" }
};
var keys = persons.Select(p => p.CustomId)
                  .Concat(organizations.Select(o => o.CustomId));
var customers = new Customers
{
    Persons = persons,
    Organizations = organizations,
    Keys = new HashSet<string>(keys),
}

但正如其他人所说,这种实现存在更多问题。是否要对 Customers 类的每个使用者使用此语法?如何使密钥集合与个人和组织集合保持最新,例如在中添加或删除项目时?

public class Customers
{
    public List<Person> Persons { get; set; }
    public List<Organization> Organizations { get; set; }
    public Customers()
    {
        Persons = new List<Person>();
        Organizations = new List<Organization>();
    }
    public Customers(IEnumerable<Person> persons,
                     IEnumerable<Organization> organizations)
        : this()
    {
        Persons.AddRange(persons);
        Organizations.AddRange(organizations);
    }
    public IEnumerable<string> Keys
    {
        return Persons.Select(p => p.CustomId)
                      .Concat(Organizations.Select(o => o.CustomId));
    }
}

那么呼叫站点可能如下所示:

var persons = new List<Person>
{
    new Person { CustomId = "111" },
    new Person { CustomId = "222" }
};
var organizations = new List<Organization>
{
    new Organization { CustomId = "333" }
};
var customers = new Customers(persons, organizations);
var keys = customers.Keys;

将密钥转换为公共属性,如下所示:

public HashSet<string> Keys
{
   get
   {
      // create and return a new hashset from persons and organizations
   }    
}

这样,您就必须考虑更新您的密钥成员。