从对象初始化器中访问属性

4

我有以下的Person

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
    public IEnumerable<Person> Children { get; set; }
}

我可以这样初始化它:
Person p = new Person() { FirstName = "John", LastName = "Doe" };

但是,在对象初始化程序中是否可以引用Person的另一个属性,以便我可以像这样做些什么呢?

Person p = new Person()
{
    FirstName = "John",
    LastName  = "Doe",
    Children  = GetChildrenByFullName(FullName);
};

编辑

为了这个问题,所引用的属性不必根据其他属性计算,但其值可以在构造函数中设置。

谢谢

3个回答

4
你不能这样做:
void Foo()
{ 
  String FullName = "";

  Person p = new Person()
  {
    FirstName = "John",
    LastName  = "Doe",
    Children  = GetChildrenByFullName(FullName); // is this p.FullName 
                                                 // or local variable FullName?
  };
}

即使您指定 p.FullName,它也不起作用,这真是遗憾。 - Rawling
@Rawling:为什么会很可惜呢?对象初始化器是变量声明的一部分,因此编译器在这里是公平的——在初始化之前使用了 p - Dennis
1
这段代码构造了一个 new Person(),然后在其上调用属性设置器。当您调用 FullName 时,Person 已经被构造,因此该属性可以被调用。不幸的是,Person 是在临时变量中构造的,而不是直接在 p 中构造,因此您无法像这样访问其属性。(可能有很好的理由,但在这种特殊情况下,这是一件遗憾的事情。) - Rawling
我理解你的观点,关于它是声明的一部分。 - Rawling

-2

不。当在对象初始化器内部时,您并不在类的实例内部。换句话说,您只能访问可以设置的公开暴露的属性。

明确地说:

class Person
{
    public readonly string CannotBeAccessed;
    public  string CannotBeAccessed2 {get;}
    public void CannotBeAccessed3() { }

    public string CanBeAccessed;
    public string CanBeAccessed2 { set; }
} 

他所谈论的属性是一个公共属性。 - Rawling
我可以有另一个属性 public string PersonId { get; set; },但我也无法访问它。 - Adi Lester
1
@Adi 没错:你不能这样做的原因“不是”“因为你无法访问私有属性”。 - Rawling
@Rawling,我更多地谈论的是对可以用于设置属性的属性/方法的访问限制。换句话说,您可以访问用于“设置”的属性,但不能访问用于“获取”的属性。 - Justin Harvey

-2

我认为你可以通过使用私有局部变量来支持你的属性来解决问题,例如:

class Person {
    private string m_FirstName = string.Empty;
    private string m_LastName = string.Empty;

    public string FirstName {
        get { return m_FirstName; }
        set { m_FirstName = value; }
    }

    public string LastName {
        get { return m_LastName; }
        set { m_LastName = value;}
    }

    public string FullName {
         get { return m_FirstName + " " + m_LastName; }
    }

    public IEnumerable<Person> Children { get; set; }
}

假设对象初始化程序按照初始化代码中指定的顺序设置属性(应该如此),则本地变量应该可以通过 FullName 只读属性在内部访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接