繁体   English   中英

将动态转换为对象

[英]Converting dynamic to object

这是我的代码:

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。

类似于dbaseman的回答(以及AKX的评论)我会使用Cast

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

您需要LINQ的using指令:

using System.Linq;

在您的文件的顶部。 如果无法识别Select方法,听起来好像没有。

请注意,这假设每个值确实MyClass引用。

编辑:如果您希望能够通过索引访问值,我建议使用ToList

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

虽然ToArray也可以工作,但在大多数情况下,我个人更喜欢列表而不是数组,因为它们更灵活。

编辑:听起来你的结果实际上充满了ExpandoObject 您需要从每个项目创建一个新的MyClass实例,例如

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();

只是一个例子,我不希望直接工作 - 我们不能做得更好,因为我们对你的结果实际返回的方式一无所知。

听起来好像你在这里,我害怕。

你只需要转换每个单独的对象:

MyClass[] vats = here.All().Select(item => (MyClass)(dynamic)item).ToArray();

在创建解决方案之前要解决的第一件事是对象在运行时将具有哪些类型。 从您的评论中看到它们将是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();

这有点hackish,因为JavaScriptSerializer并不打算这样做但它确实解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM