2008-10-03 19 views
5

我一直在努力加快在C#中的一些新功能,其中一個我沒有機會使用的是匿名類型。除了LINQ查詢之外,您如何在C#中使用匿名類型?

我瞭解與LINQ查詢有關的用法,我查看了this SO post其中的一個問題。我在網上看到的大多數例子都與LINQ查詢有關,這很酷。我也看到了一些有些人爲的例子,但沒有看到很多有價值的東西。

您是否有一種新穎的用於匿名類型的地方,您認爲它真的爲您提供了一些實用程序?

回答

6

通過一些反思,您可以將匿名類型轉換爲字典<字符串,對象>;羅伊Osherove博客他的技術爲這個位置:http://weblogs.asp.net/rosherove/archive/2008/03/11/turn-anonymous-types-into-idictionary-of-values.aspx

雅各木匠使用匿名類型的方式與類似的語法反對初始化不可變對象初始化:http://jacobcarpenter.wordpress.com/2007/11/19/named-parameters-part-2/

匿名類型可以作爲一種方式讓easier-使用foreach語句重複讀取集合中對象屬性的別名。 (不過,說實話,這真的沒有什麼比標準使用匿名類型與LINQ to Objects更多。)例如:

Dictionary<int, string> employees = new Dictionary<int, string> 
{ 
    { 1, "Bob" }, 
    { 2, "Alice" }, 
    { 3, "Fred" }, 
}; 

// standard iteration 
foreach (var pair in employees) 
    Console.WriteLine("ID: {0}, Name: {1}", pair.Key, pair.Value); 

// alias Key/Value as ID/Name 
foreach (var emp in employees.Select(p => new { ID = p.Key, Name = p.Value })) 
    Console.WriteLine("ID: {0}, Name: {1}", emp.ID, emp.Name); 

雖然不是這短短的樣品中有較大提升,如果foreach循環是更長的時間,參考IDName可能會提高可讀性。

2

匿名類型的最大用處是LINQ,實際上這就是它創建的原因。

我想一個原因是匿名類型之外LINQ是創建一個臨時結構狀物體,例如:

var x = new { a = 1, b = 2 }; 

,可能使在某些情況下你的生活變得更輕鬆。

+0

感謝您的答覆。我想我正在尋找那些我想要這樣做的情況之一。 – itsmatt 2008-10-03 18:57:03

5

ASP.NET MVC路由在所有地方使用這些對象。

3

偶爾我懷疑它可能是有用的,如一個LINQ查詢,但不會發生使用LINQ - 但你仍然需要一種投影。我不認爲我會在他們當前的形式中使用匿名類型,與LINQ預測完全不同。

一個我希望看到的事情是創建「命名」類型的簡單聲明,作爲壓倒一切的Equals/GetHashCode的這將產生同樣的方式爲匿名類型的屬性和構造,以及/能力, ToString以相同(有用)的方式。然後,當需要增加更多行爲時,這些類型可以轉換爲「正常」類型。

同樣,我不認爲我會經常使用它 - 但是每隔一段時間,這種能力都會很方便,尤其是在一些課堂上的幾種方法中。這可能是更大的努力的一部分,以便爲C#5中的不可變類型提供更多支持。

3

爲了增加正義所說的話,ASP.Net MVC是我見過的第一個以有趣和有用的方式使用的地方。這裏有一個例子:


Html.ActionLink("A Link", "Resolve", new { onclick = "someJavascriptFn();" }) 

ASP.Net MVC使用這樣的匿名類型向HTML元素添加任意屬性。我想有很多不同的方法可以完成同樣的事情,但我喜歡匿名類型的簡潔風格,它給了更多動態語言感覺。

+0

感謝您的輸入! – itsmatt 2008-10-05 22:52:50