首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将匿名类型的列表强制转换为动态对象列表

将匿名类型的列表强制转换为动态对象列表
EN

Stack Overflow用户
提问于 2013-04-24 11:38:37
回答 2查看 41.8K关注 0票数 20

为什么我不能将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专业版构建,平台是ASP.NET。

请帮忙,提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-24 11:50:21

因为List<T>是内变的,而不是协变的,所以你必须转换成支持协变的IEnumerable<dynamic>

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

了解更多information about covariant

票数 48
EN

Stack Overflow用户

发布于 2013-04-24 11:52:59

首先,使用泛型进行类型转换不会以这种方式工作。此转换无效:

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

原因是列表不是协变的。如果是这样的话,你可以使用source2.Add(source2);,突然source1包含了它自己,而实际上它应该只有字符串。

其次,Anonymous types只是编译器声明的类,具有只读属性和值相等语义。如果您创建了一个具有只读属性和值相等语义的类,则您的类将与匿名类型相同,只是您的类型具有由开发人员确定的名称,而匿名类型具有由编译器确定的名称。匿名类型并不特殊。

第三,dynamic变量是一种绕过编译器类型检查的方法。它们不会绕过运行时类型检查。您可以使用c#强制转换语法显式地将类型转换为动态...注意:这不是演员阵容!不能对运行时不存在的类型执行运行时强制转换。

但是,编译器不会解析包含动态类型表达式的操作,也不会对其进行类型检查。编译器将有关操作的信息打包在一起,这些信息稍后将用于在运行时计算操作。作为该过程的一部分,动态类型的变量被编译成对象类型的变量。因此,动态类型只存在于编译时,而不存在于运行时。

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();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16182952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档