2015-12-09 90 views
16

我試圖讓琴絃的List從我的動態對象名單,並口口聲聲說:C#動態選擇字符串列表

錯誤1無法隱式轉換類型 「System.Collections.Generic.List<dynamic>」到 「System.Collections.Generic.List<string>

我選擇一個屬性,它使用.ToString()

var objects = new List<dynamic>(); 
//filling objects here 

List<string> things = objects.Select(x => x.nameref.ToString()).ToList(); 

那它不是一個有效的字符串列表嗎?爲什麼編譯器假定這個列表的類型是dynamic

我試過也從this轉換答案,但它不斷給我同樣的錯誤。

任何人都知道如何使它List<string>

編輯:

爲什麼它不工作?因爲你可以使這樣的:

public class Test 
{ 
    public int ToString() 
    { 
     return 0; 
    } 
} 

和編譯器將不知道是否ToString回報stringint

回答

18

你需要投的項目,像這樣:

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>().ToList(); 

它不認識到ToString()返回字符串的原因是它在dynamic對象,並且方法綁定在運行時完成,而不是編譯時。

+3

大,爲解釋謝謝:) – wudzik

+1

@wudzik高興地幫助,隊友:) – Rob

+1

我編輯了我的問題,添加示例爲什麼它不工作靈感來自您的答案:) – wudzik

5

你可以嘗試使用演員,像這樣:

List<string> things = objects.Select(x => x.nameref).Cast<string>().ToList(); 

您也可以嘗試在Select鑄件本身:

List<string> things = objects.Select(x => x.nameref as string).ToList(); 
2

就我的理解,轉換到所需的List<string>可以按如下方式完成。

var objects = new List<dynamic>(); 

// filling objects here 

List<string> things = objects.Select(x => x.nameref.ToString()).Cast<string>.ToList(); 
7

雖然接受的答案工作正常,讓我提出一個替代方案:鑄造nameref爲正確的類型(通過更具體的投更換(object),如果你碰巧知道nameref類型):

List<string> things = objects.Select(x => ((object)x.nameref).ToString()).ToList(); 

該解決方案的優點是ToString是靜態解決的。因此,該方法調用

  • 保證返回string,因爲編譯器知道你在呼喚Object.ToString()(或其重寫變體)和

  • 更快和更清潔。該解決方案可將動態分辨率保持爲所需的絕對最小值(即分辨率爲x.nameref)。致電ToString的錯字被編譯器捕獲。

(當然,如果nameref類型恰好是字符串,你能把調用ToString(),使你的代碼更清潔和更短。)

+0

很好的答案,謝謝!我會嘗試這種方法。 – wudzik