2011-12-30 44 views
2

我有以下代碼:投放問題

private void EntryBrowserLoad(object sender, EventArgs e) 
    { 
     var ase = new AprilShowersEntities(); 

     var q = 
      from d in ase.Entries 
      orderby d.EntryEndTime 
      select d; 

     var dateQuery = from d in q.AsEnumerable() 
         select new 
         { 
          d.EntryEndTime, 
          d.EntryId, 
          d.EntryPlainText, 
          d.EntryStartTime, 
          d.EntryText, 
          EntryHeader = GetEntry(d.EntryEndTime, d.EntryPlainText) 
         }; 

     lcEntries.DisplayMember = "EntryHeader"; 
     lcEntries.DataSource = dateQuery; 
    } 

    private void BtnOkClick(object sender, EventArgs e) 
    { 
     var q = (Entry) lcEntries.SelectedItem.Value; // Error here on this line 

     MessageBox.Show(q.EntryText); 
    } 

我的問題是其獲得上面標線的錯誤,抱怨不能夠把對象放回條目對象。我敢肯定,原因是因爲我在我的LINQ查詢中使用了select new。我的問題是,我如何讀取返回的SelectedItem.Value對象的EntryText屬性?

回答

6

您正投射到匿名類型中。要在編譯時安全性和特性(如Intellisense)的其他地方(包含方法的上下文之外)引用結果,需要將其投影到具體類型中。如果你還沒有這樣的類,然後定義一個類來描述你的元素

class TheEntry { /* define properties */ } 

然後用您的查詢

select new TheEntry 

選擇到類,然後你可以轉換到該類

var entry = (TheEntry)lcEntries.SelectedItem.Value; 

一旦開始傳遞查詢結果或需要在其包含的方法之外訪問它,通常最好定義一個適當的類型。但是,您也可以通過使用動態綁定或運行時綁定來在技術上繞過此操作。我不會推薦它,但它是一種可用的方法。

dynamic entry = lcEntries.SelectedItem.Value; 
MessageBox.Show(entry.EntryText); // no compile-time support, purely runtime