2

Scott Guthrie がここで説明している Dynamic Linq Library を使用しています。

Scott Guthrie の例は素晴らしく、私は動的 Where ステートメントをかなり使用しました。

しかし今、動的選択機能を使用する必要がある状況に直面しています。Scott Guthrie は、この機能のスクリーンショット (記事の最後のスクリーンショット) を示していますが、非常に巧妙に説明していません。

問題は、コードがコンパイルされて実行されたとしても、それが有用な方法でどのように機能するかがわからないことです。おそらく反射で?

以下に例を示します (Guthrie が上記の記事で説明している Dynamic Linq Library を使用する必要があります。これは通常の Linq System.Linq ではありません)。

ここのサンプルでは、​​UserId、FirstName、および LastName フィールドを持つ Users テーブルがあります。しかし、どのデータベースを使用するかは問題ではありません。この問題は非常に簡単に再現できます。ここに私のサンプルコードがあります:

最初に、この using ステートメントが一番上にあることを確認してください。

    using System.Linq.Dynamic;

次に、次のコードを実行できます。

using (DataClasses1DataContext dcdc = new DataClasses1DataContext())
        {
            var x = dcdc.Users.Select("new(UserId, FirstName, LastName)");
            foreach (var item in x)
            {                    

                Console.WriteLine(item.ToString());
            }
        }

ご覧のとおり、これは問題なくコンパイルおよび実行されます。データベースからすべてのレコードを取得します。ただし、新しい匿名型のメンバーに実際にアクセスする方法はありません。

Select クエリは文字列であるため、設計時に型の推論は行われません。だから私は書くことができません:

Console.WriteLine(item.UserId);

コンパイラは、匿名型アイテムに UserId という名前のメンバーがあることを認識していません。そのため、コードはコンパイルされません (For..Each ループ中にデバッガーを一時停止しても、デバッグ ウィンドウに UserId、FirstName、LastName メンバーがあることがわかります)。

それで...これはどのように機能するはずですか?匿名型のメンバーにアクセスするにはどうすればよいですか?

4

1 に答える 1

4

内部でリフレクションを使用するデータバインディング(これは意図されたユースケースだと思います)には問題なく機能します。.NET4.0でも正常に動作dynamicします。

foreach (dynamic item in x) { 
    Console.WriteLine(item.UserId);
}

それ以外は…リフレクションかTypeDescriptor

foreach (object item in x) {
    Console.WriteLine(item.GetType().GetProperty("UserId").GetValue(item, null));
}
于 2009-12-01T16:43:31.610 に答える