c# - LINQ Union 不同类型 - 动态转换为接口(interface)?

标签 c# linq casting union

我有 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是。如果类型 TelJun2011TelJul2011 不是结构(值类型),您可以利用 IEnumerable<out T>协方差像这样:

jun.Union<object>(jul)

这是有效的,因为 TelJun2011TelJul2011都是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/

相关文章:

c# - .Net 3.5 使用代码约定实现 String.IsNullOrWhitespace

c# - C#获取ClassName : Exception TargetSite.DeclaringType.Name Vs MethodBase.GetCurrentMethod().DeclaryingType

c# - 制作领域中立程序集的步骤是什么?

c# - 使用 linq 时如何最好地清理 SQLDataReader

c++ - 使用函数指针将 C 转换为 CPP

rust - 如何将 char 转换为整数并在 Rust 中匹配武器?

c++ - C - 将指针转换为指向 void 的指针

C# 参数值转为字符串?

c# - MVC,Linq - 排序问题

c# - 如果值为字符串类型则按片段搜索,但如果值为 int 则按整个搜索