2013-01-23 34 views
0

我如何修改下面的代碼:移動隱式類型變量對象初始化器

var people = new[] { 
    new { name = "John", surname = "Smith" }, 
    new { name = "John", surname = "Doe" }, 
}; 

不想要使用var關鍵字(這樣我就可以初始化變量對象初始化器),並仍然能夠訪問像這樣的元素?:

System.Console.WriteLine(people[0].surname); //John 
System.Console.WriteLine(people[1].surname); //Doe 
+3

您可以*已經*以這種方式訪問​​'people [0] .surname'。目前還不清楚你想要達到的目標還不是很好......或者你在談論一個* field *初始值設定項嗎? (重要的是要在這裏獲得術語。) –

+0

@JonSkeet我希望變量'people'是一個公共對象屬性。 –

+0

然後你需要使用動態類型,或者創建一個暴露這些屬性的命名類型。匿名類型根本沒有設計爲暴露。 –

回答

5

定義模型:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

,然後有一個collection of this model

List<Person> people = new List<Person>(); 
people.Add(new Person { Name = "John", Surname = "Smith" }); 
people.Add(new Person { Name = "John", Surname = "Doe" }); 

或:

var people = new List<Person> 
{ 
    new Person { Name = "John", Surname = "Smith" }, 
    new Person { Name = "John", Surname = "Doe" } 
}; 

,然後你仍然可以:

System.Console.WriteLine(people[0].Surname); //John 
System.Console.WriteLine(people[1].Surname); //Doe 
創建陣列時

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

然後使用該類型:

+0

好點,我可能會那樣做。然而,你確定沒有更簡單的方法來初始化相同的對象,通過使用var關鍵字? –

+0

當然,如果你願意,你可以使用'var'關鍵字:'var people = new List ();',或者你甚至可以把它作爲一行代碼,如果你願意的話:var people = new List {新人{姓氏=「約翰」,姓=「史密斯」},新人{姓氏=「約翰」,姓=「Doe」}};'。 –

5

你不能;您將不得不爲這些對象定義適當的類或重新使用它們(例如Tuple)。

從技術上講,從vardynamic的單字改變也會有所斬獲,但這當然會顯着地改變成員的本質,所以它不是等同於任何想象力。

2

首先,您需要爲數據創建一個名爲類型

People[] people; 

//... 

people = new People[]{ 
    new Person{ Name = "John", Surname = "Smith" }, 
    new Person{ Name = "John", Surname = "Doe" }, 
}; 
1

你可以使用「動態」

dynamic people = new[] { 
    new { name = "John", surname = "Smith" }, 
    new { name = "John", surname = "Doe" }, 
}; 

然後叫它

Console.WriteLine(people[0].name); 

注 - 適用於框架4.0以上,也提到了已提到的警告。