从匿名类型创建对象

时间:2016-09-28 07:57:08

标签: c# entity-framework linq dynamic

我将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返回正确的类型?

2 个答案:

答案 0 :(得分:0)

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

  

无法隐式转换类型   'System.Collections.Generic.List&LT; dynamic&GT;'至   'System.Collections.Generic.List&LT; SomeObject&GT;'

甚至将查询更改为

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之后仍然可行,但您的代码似乎不正确。如果你付出一点努力,我相信你会找到另一种方法,例如使用继承泛型等。

答案 1 :(得分:0)

试试这个:

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