![](/img/trans.png)
[英]Cast a list of objects to list of an interface type at runtime when target type is dynamic
[英]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<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.