2012-06-01 42 views
1

說我有下面的代碼:可以訂購動態類型嗎?

dynamic myData = GetMyData(); 
foreach(dynamic d in myData.data) 
{ 
    Console.WriteLine(d.name); 
} 

我怎麼能WriteOut的所有名字的字母順序?如果我正在使用類似List<MyClass>的東西,我只會使用myData.OrderBy(t => t.name),但在使用動態類型時似乎不起作用。

有關如何訂購這些值的任何建議?

+2

爲什麼你使用動態? var myData = GetMyData()。OrderBy(t => t.name);'? –

+1

我使用的是Facebook C#SDK,他們給出的例子都使用'dynamic'。這是我第一次接觸「動態」類型,所以我不能聰明地說出爲什麼或爲什麼不應該在這種情況下使用它們。說實話,我不太確定動態和匿名類型的差異,但這是一個完全不同的職位。我打算再研究一下這個問題,但現在我只想知道這是否可以完成。如果沒有,沒什麼大不了的。 [擴展方法和在c#動態對象]的 –

+0

可能重複(http://stackoverflow.com/questions/5311465/extension-method-and-dynamic-object-in-c-sharp) – nawfal

回答

7
Enumerable.OrderBy(myData, (Func<dynamic, dynamic>)(t => t.name)); 

這應該返回相同的myData.OrderBy(t => t.name)通常會。

由於OrderBy是一個擴展的方法,它不會在動態類型工作。見this answer

+1

導致此錯誤:「不能使用lambda表達式作爲動態調度操作的參數,而無需先將其轉換爲委託或表達式樹型」 –

+1

我添加了一個強制轉換。看看它是否有幫助。 –

+0

現在它給出了一個'RuntimeBinder'異常:「對於最佳重載方法匹配 'System.Linq.Enumerable.OrderBy <對象,對象>(System.Collections.Generic.IEnumerable ,System.Func <對象,對象>)'有一些無效的參數「 –

3

這可能會爲你工作:

IEnumerable<dynamic> sequence = Enumerable.Cast<dynamic>(myData); 
foreach (var result in sequence.OrderBy(x => x.name)) 
{ 
    Console.WriteLine(result.name); 
} 

基本上調用Cast<dynamic>並轉換爲IEnumerable<dynamic>後,你可以做你喜歡什麼樣的序列,而不是單個值。

不是我實際上試過以上,但我相信它應該工作。

+0

這不工作,以及正在嘗試 –