我有 10 个表,它们以不同的类型呈现给 LINQ,但共享完全相同的属性。当我尝试对它们运行联合时,编译器告诉我:
"Argument 2: cannot convert from 'System.Collections.IEnumerable' to 'System.Collections.Generic.IEnumerable<LINQPad.User.TelJun2011>'"
代码是这样的
var jul = (from n in TelJul2011s select n);
var jun = (from p in TelJun2011s select p);
jun.Union(jul).Dump();
我已经完成我的研究并了解到联合不能跨不同的类型执行,我也知道联合可以在匿名类型上执行,如果它们共享相同的属性。此选项对我不起作用,因为我需要所有表中的所有属性并且不想输入相同的匿名类型 10 次 - 每个变量一次。我希望编译器基于所有属性都相同这一事实推断出它们都是同一类型。
我已经尝试使用 AsQueryable() 类型函数和“as”关键字转换为 IEnumberable、Iqueryable、Datatable 等。这些似乎都不适合我。
我想知道是否有某种方法可以通过动态转换为父类型来做到这一点。我无法编辑类的初始声明,因此无法在它们上实现通用接口(interface)以进行强制转换。但是有没有什么方法可以在使用类型时将它们向下转换为通用接口(interface),而无需编写从每种类型到父接口(interface)的转换?
感谢您的任何建议!
最佳答案
Union
的结果将是 IEnumerable<Xxx>
但在这种情况下你必须指定什么 Xxx
是。如果类型 TelJun2011
和 TelJul2011
不是结构(值类型),您可以利用 IEnumerable<out T>
的协方差像这样:
jun.Union<object>(jul)
这是有效的,因为 TelJun2011
和 TelJul2011
都是object
, 然后通过协方差 IEnumerable<TelJun2011>
和 IEnumerable<TelJul2011>
都是IEnumerable<object>
.
当然object
不具备 TelJun2011
共有的所有属性和 TelJul2011
.如果这两种类型有一个更有用的公共(public)基类或实现一个公共(public)接口(interface)会更好,因为那样你就可以说例如:
jun.Union<ITelMonth>(jul)
哪里ITelMonth
是包含您想要的通用属性的某种类型。
关于c# - LINQ Union 不同类型 - 动态转换为接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540846/