2011-12-30 13 views
2

を使用するときに問題がキャスティング:、私は次のコードを持ってLINQ [New]を選択

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); 
    } 

私の問題は、そのバックEntryオブジェクトにオブジェクトをキャストすることができない不満、上記マークされた行にエラーを得ているが。なぜなら、LINQクエリでselect newを使用しているからです。私の質問は、どのように返されたSelectedItem.ValueオブジェクトのEntryTextプロパティを読み取ることができますですか?

答えて

6

あなたは匿名のタイプになります。 Intellisenseのようなコンパイル時の安全性と機能を備えた他の場所(包含メソッドのコンテキスト外)で結果を参照するには、具体的な型に投影する必要があります。あなたはすでにそのようなクラスを持っていない場合は、クエリ

select new TheEntry 

でクラスに選択し、次にあなたが

そのクラスそれにキャストすることができます次に、あなたの要素

class TheEntry { /* define properties */ } 

を記述するクラスを定義

一般的に、クエリ結果を渡すようになったら適切な型を定義するのが一般的です。ただし、これを技術的にバイパスするには、動的バインディングやランタイムバインディングを使用することもできます。私はそれををお勧めしませんが、それは利用可能なアプローチです。

dynamic entry = lcEntries.SelectedItem.Value; 
MessageBox.Show(entry.EntryText); // no compile-time support, purely runtime 
関連する問題