7

これが私のコードです:

MyClass here = new MyClass();
IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All();

All() メソッドは IEnumerable<dynamic> を返します。IEnumerable<MyClass> に変換したい。上記の行は機能しません。型 'd__15' のオブジェクトを型 'System.Collections.Generic.IEnumerable`1[MyClass]' にキャストできません。

私も試しました:

 IEnumerable<MyClass> vats = here.All() as IEnumerable<MyClass>;

しかし、それはnullを返します。

4

3 に答える 3

6

dbaseman の回答 (および AKX のコメント) と同様に、次を使用しますCast

IEnumerable<MyClass> vats = here.All().Cast<MyClass>();

usingただし、LINQのディレクティブが必要です。

using System.Linq;

ファイルの上部にあります。Selectメソッドが認識されない場合は、それを取得していないようです。

これは、各値が実際に参照であることを前提としていることに注意してMyClassください。

編集:インデックスで値にアクセスできるようにしたい場合は、次を使用することをお勧めしToListます:

List<MyClass> vats = here.All().Cast<MyClass>().ToList();

これも機能しToArrayますが、個人的には、ほとんどの場合、配列よりもリストの方が柔軟性に優れているため、リストを好みます。

編集:あなたの結果は実際にはいっぱいのようですExpandoObjectMyClass各アイテムからの新しいインスタンスを作成する必要があります。

List<MyClass> vats = here.All()
                         .Select(item => new MyClass(item.Name, item.Value))
                         .ToList();

またはおそらく:

List<MyClass> vats = here.All()
                         .Select(item => new MyClass {
                                     Name = item.Name,
                                     Value = item.Value,
                                 })
                         .ToList();

これは単なる例であり、すぐには機能しないと思います。結果が実際にどのように返されるかについては何も知らないため、これ以上のことはできません。

残念ながら、あなたはここで頭を抱えているように聞こえます。

于 2012-05-07T06:56:58.570 に答える
1

個々のオブジェクトをキャストするだけです。

MyClass[] vats = here.All().Select(item => (MyClass)(dynamic)item).ToArray();
于 2012-05-07T06:50:01.417 に答える
0

ソリューションを作成する前に最初に解決しなければならないことは、実行時にオブジェクトが持つ型です。コメントから、それらが ExpandoObjects になることを確認し、MyClass が ExpandoObject から派生していないと仮定すると、.Cast<T>キャストのみをサポートし、カスタム変換をサポートしないため、メソッドを使用できません。

JavaScriptSerializerを使用して ExpandoObjects から変換するために使用できるトリックがあります

このリンクから、使用できる拡張メソッドを取得します

public static IEnumerable<T> Convert<T>(this IEnumerable<dynamic> self){
    var jsSerializer = new JavaScriptSerializer();
    foreach(var obj in self){
        yield return jsSerializer.ConvertToType<T>(obj);
    }
}

あなたの場合、あなたがしなければならないことは、スキーツのキャストの回答を変換に変更することだけです。

List<MyClass> vats = here.All().Convert<MyClass>().ToList();

JavaScriptSerializer はこれを行うことを意図していないため、これは少しハックですが、問題は解決します。

于 2012-05-07T07:18:40.213 に答える