繁体   English   中英

从匿名类型创建对象

[英]Create Object from Anonymous Type

我将 EntityFramework 用于数据库中的对象列表,并使用匿名类型最终返回正确的对象。 因为有几个函数必须执行此“匿名类型转换”,所以我想将其提取为函数。

我可以创建一个函数来创建动态,但不能创建一个将动态转换为特定类型的函数,因为如果该函数的参数包含动态,则返回类型也是动态类型。

这有效:

  List<SomeObject> list = list
            .Select(i => GetAnonymousType(i))
            .Select(i => new SomeObject {Item1 = i.Item1, Item2 =i.Item2}).ToList();

这不会:

List<SomeObject> list = list
         .Select(i => GetAnonymousType(i))
         .Select(i => CreateSomeObjectFromDynamic(i)).ToList();

 private static SomeObject CreateSomeObjectFromDynamic(dynamic i)
 {
     return new SomeObject {Item1 = i.Item1, Item2 = i.Item2};
 }

请参阅: https : //dotnetfiddle.net/zLFlur

有没有办法可以使用像 CreateSomeObjectFromDynamic 这样的函数来返回正确的类型?

根据fiddle提供的代码,您的问题不CreateSomeObjectFromDynamic方法,而在于GetAnonymousType方法。 此方法返回dynamic ,.NET 无法处理它。 编译器错误说:

无法将类型“System.Collections.Generic.List< dynamic >”隐式转换为“System.Collections.Generic.List< SomeObject >”

甚至将查询更改为

list = list
      .Select(i => CreateSomeObjectFromDynamic(GetAnonymousType(i)))
      .ToList();

会产生同样的错误。 但是,如果您将GetAnonymousType方法的返回类型更改为object ,如下所示:

private static object GetAnonymousType(SomeObject i)
{
    return new { Item1 = i.Item1, Item2 = i.Item2 };
}

你的问题将得到解决。 但是,这在内存中有效,如果您尝试将它与IQueryable一起使用,我不确定它是否会成功转换为 SQL。 此外,我不建议使用dynamic ,即使它在将返回类型更改为object后仍然有效,您的代码似乎不正确。 如果你付出一点努力,我相信你会找到另一种方法,例如使用继承泛型等。

尝试这个:

      list = list
     .Select(i => GetAnonymousType(i))
     .Select(i => CreateSomeObjectFromDynamic(i) as SomeObject).ToList();

暂无
暂无

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

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