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);
};

編集

質問のために、参照されるプロパティは他のプロパティに従って計算される必要はありませんが、その値はコンストラクターで設定できます。

ありがとう

4

3 に答える 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?
  };
}
于 2012-08-08T07:35:16.340 に答える
-2

いいえ。オブジェクト初期化子の中にいるときは、クラスのインスタンスの中にいません。つまり、設定可能な一般に公開されたプロパティにのみアクセスできます。

明示的に:

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

    public string CanBeAccessed;
    public string CanBeAccessed2 { set; }
} 
于 2012-08-08T07:42:44.247 に答える
-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 読み取り専用プロパティによって内部的に) アクセス可能である必要があります。

于 2012-08-08T14:13:26.340 に答える