2013-04-24 12 views
16

List<AnonymousObject>List<dynamic>にキャストできないのはなぜですか?匿名タイプのリストを動的オブジェクトのリスト

var datasource = someList.Select(o => new { x = o.A, y = o.B }); 
dgvSomeGridView.DataSource = datasource.ToList(); 
dgvSomeGridView.DataBind(); 

は、その後、私は次のコードでGridView.DataSourceにアクセスします:私はこの次のコードを持って

var ds = ((List<dynamic>)dgvSomeGridView.DataSource); 
.... 

しかし、それは私がList<dynamic>にキャストの行にエラーがスローされますが、それは言う:

タイプSystem.Collections.Generic.List'1[<>f__AnonymousType0'8[System.Int32,System.String]]のオブジェクトをタイプSystem.Collections.Generic.List'1[System.Object]にキャストできません。

のはなぜdynamicに匿名型のリストをキャストすることはできません、またはエラーがobjectタイプに言うように?どうすれば解決できますか?

マイコードはC#、フレームワーク4.0、VS2010 Proでビルド、プラットフォームはASP.NETです。

ご協力いただきありがとうございます。 List<T>以来

答えて

35

はインバリアントではなく、コ変形であるので、あなたは共同バリアントサポートするIEnumerable<dynamic>にをキャストする必要があります。第一に、よりinformation about covariant

+1

を追加することを忘れないでください

var anonList = GetAnonList(); List<object> objectList = anonList.Cast<object>().ToList(); 
"をSystem.Linq;を使用します。あなたの文書ヘッダーでまだあなたが持っていない場合には –

6

については

var ds = ((IEnumerable<dynamic>)dgvSomeGridView.DataSource).ToList(); 

、ジェネリックでキャスティングをそのようには機能しません。このキャストは無効です:

List<string> source = GetStrings(); 
List<object> source2 = (List<object>) source; 

なぜなら、リストは共変型ではないからです。それがあった場合、source2.Add(source2);と突然source1は文字列しか持たないときにそれ自身を含みます。

第2に、Anonymous typesは、readonlyプロパティと値の等価セマンティクスを持つコンパイラで宣言されたクラスです。 readonlyプロパティと値の等価セマンティクスを持つクラスを作成した場合、そのクラスは開発者が決定した名前を持つことを除いて匿名型と同じになりますが、匿名型はコンパイラが決定する名前を持ちます。 Anonタイプは特別ではありません。

第3に、dynamic変数はコンパイラの型チェックを回避する方法です。実行時の型チェックは行われません。明示的に型を動的に変換するために、C#のキャスト構文を使用することができます...注:これはキャストではありません!実行時に存在しない型への実行時キャストは実行できません。

ただし、動的型の式を含む操作は、解決されず、コンパイラによって型チェックされません。コンパイラは、操作に関する情報をまとめてパッケージ化します。この情報は、後で実行時に操作を評価するために使用されます。プロセスの一環として、動的な型の変数はオブジェクト型の変数にコンパイルされます。したがって、動的な型はコンパイル時にのみ存在し、実行時には存在しません。

var anonList = GetAnonList(); 
List<dynamic> dynamicList = anonList.Select(x => (dynamic)x).ToList(); 

をしかし、あなたは同じように簡単にこれを行うこともできます:あなたはまだList<dynamic>をしたい場合

static void convertToDynamic() 
{ 
    dynamic d; 
    int i = 20; 
    d = (dynamic)i; 
    Console.WriteLine(d); 

    string s = "Example string."; 
    d = (dynamic)s; 
    Console.WriteLine(d); 

    DateTime dt = DateTime.Today; 
    d = (dynamic)dt; 
    Console.WriteLine(d); 

} 
// Results: 
// 20 
// Example string. 
// 2/17/2009 9:12:00 AM 

最後に、これを行うには、

+0

素晴らしい、これは私のために働く! –

関連する問題