2

.Select(string selectors).NET 4.5 で動的 LINQ からの結果を列挙する方法を理解しようとしています。動的 linq はSystem.Linq.Dynamic名前空間から取得されます。

編集:私も含めてSystem.Linqいます。

次のようなメソッドがあります。

    public void SetAaData(List<T> data, List<string> fields)
    {
        if (data == null || data.Count == 0)
        {
            return;
        }
        var dynamicObject = data.AsQueryable().Select("new (" + string.Join(", ", fields) + ")");
        _aaData = dynamicObject;
    }

コードをステップ実行すると、それを調べdynamicObjectて列挙し、結果 (正しい) を表示できます。問題は、単体テストをパスさせようとしているのに、dynamicObject で何もアクセスできないことです。_aaDataフィールドは type として定義されますdynamic

私のテスト方法では、これを試しました:

        var hasDynamicProperties = new MyClass<MyType>();
        dgr.SetAaData(data, fields); // data is a List<MyType>
        Assert.IsTrue(hasDynamicProperties.AaData.Count > 0);

このテストを実行すると、次のエラーが表示されます。

MyTestingClass threw exception: 
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery<DynamicClass1>' does not contain a definition for 'Count'

だから、私はそれをリストにキャストしようとしました:

Assert.IsTrue(dgr.AaData.ToList().Count() > 0);

次のエラーが発生しました。

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery<DynamicClass1>' does not contain a definition for 'ToList'

それで、System.Linq.EnumerableQuery<T>ここで調べました:http://msdn.microsoft.com/en-us/library/cc190116.aspx。有効な拡張メソッドであると思われるものはすべて表示.Count()されますが、試してみると機能しません。実際、そのページのメソッドを試してみると、どれも機能しません。

私は何を間違っていますか?

4

1 に答える 1

2

dynamicオブジェクトがメンバー メソッドであるかのように、拡張メソッドをオブジェクトに適用することはできません。

Count()で定義されている拡張メソッドSystem.Linq.Queryableです。動的オブジェクトで直接呼び出すことができます。

Assert.IsTrue(Queryable.Count(hasDynamicProperties.AaData) > 0)
于 2013-05-30T18:51:09.667 に答える