从匿名类型创建对象
本文关键字:创建对象 类型 | 更新日期: 2023-09-27 18:09:15
我使用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这样的函数来返回正确的类型?
试试这个:
list = list
.Select(i => GetAnonymousType(i))
.Select(i => CreateSomeObjectFromDynamic(i) as SomeObject).ToList();
根据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
后仍然有效,但您的代码似乎不正确。如果你付出一点努力,我相信你会找到另一种方法,例如使用继承、泛型等。