簡體   English   中英

將匿名類型的強制列表列表到動態對象列表

[英]Cast List of Anonymous type to List of Dynamic Objects

為什么我不能將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[<>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>是變的,不共變體中,所以你必須澆注IEnumerable<dynamic>支持共變體:

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

有關協變的更多信息

首先,使用泛型進行轉換並不是那樣的。 此演員表無效:

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

原因是List不是共變體。 如果是,你可以source2.Add(source2); 當它應該只有字符串時,突然source1包含自己。

其次, 匿名類型只是編譯器聲明的類,具有readonly屬性和值相等語義。 如果您創建了一個具有readonly屬性和值相等語義的類,則您的類將與匿名類型相同,除非您的類型具有開發人員確定的名稱,而匿名類型具有編譯器確定的名稱。 匿名類型並不特別。

第三, 動態變量是一種繞過編譯器類型檢查的方法。 它們不會進行運行時類型檢查。 您可以使用c#casting語法將類型顯式轉換為動態...注意:這不是強制轉換! 您不能對運行時不存在的類型執行運行時強制轉換。

但是,包含dynamic類型表達式的操作不會被編譯器解析或進行類型檢查。 編譯器將有關操作的信息打包在一起,該信息稍后用於評估運行時的操作。 作為過程的一部分,dynamic類型的變量被編譯為object類型的變量。 因此,類型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

最后,如果您仍然需要List<dynamic> ,請執行以下操作:

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

但你可以輕松地做到這一點:

var anonList = GetAnonList();
List<object> objectList = anonList.Cast<object>().ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM