如何在动态数据中投放IEnumerable
到IEnumerable<T>
,无论是int
,object
还是string
这就是我获取实际数据的方式:
List<Orders> order = new List<Orders>();
Customer[] cs = { new Customer { CustNum = 5, OtherAddress = "Hello" }, new
Customer { CustNum = 986, OtherAddress = "Other" } };
Customer[] cso = { new Customer { OtherAddress = "T", CustNum = 5 }, new
Customer { CustNum = 777, OtherAddress = "other" } };
order.Add(new Orders(code + 1, "ALFKI", i + 0, 2.3 * i, "Mumbari", "Berlin", cs));
order.Add(new Orders(code + 2, "ANATR", i + 2, 3.3 * i, "Sydney", "Madrid", cso));
order.Add(new Orders(code + 3, "ANTON", i + 1, 4.3 * i, "NY", "Cholchester", cs));
order.Add(new Orders(code + 4, "BLONP", i + 3, 5.3 * i, "LA", "Marseille", cso));
order.Add(new Orders(code + 5, "BOLID", i + 4, 6.3 * i, "Cochin", "Tsawassen", cs));
我想将此IEnumerable
数据转换为IEnumerable<T>
。
我只是用PerformComplexDataOperation(order , "customer")
private IQueryable PerformComplexDataOperation(this IEnumerable dataSource, string select)
{
Type T = dataSource.GetElementType();
IQueryable<T> data = dataSource.AsQueryable().Cast<typeof(dataSource)>();
return data;
}
需要在其中执行一些其他操作。我只是粘贴我的代码概述
答案 0 :(得分:3)
通常只有在编译时能够知道类型时才使用泛型。例如,Select
上的LINQ IEnumerable<T>
扩展方法有两个通用参数 - 源类型和结果类型。
编写代码时,编译器&#34;知道&#34;源类型和结果类型基于您编写代码的方式:
var lst = new List<int>() {1,2,3};
var query = lst.Select(x => x.ToString();
//the compiler fills in the generic type parameters as follows:
var query = lst.Select<int,string>(x => x.ToString());
如果在编译时您知道类型,那么您可以Cast
IEnumerable
/ IQueryable
到适当的编译时类型:
IEnumerable lst = new List<int>() {1,2,3};
var query = lst.Cast<int>().Select(x => x*x);
或者更好的是,没有必要将变量限制为非泛型IEnumerable
;您可以使用上述var
,或明确键入变量:
IEnumerable<int> lst = new List<int>() {1,2,3};
但是,我怀疑你在编译时并不知道这种类型,在这种情况下,仿制药不会帮助你。 1
在这种情况下,您可以使用System.Linq.Dynamic.Core库,它允许您通过传入字符串而不是委托/表达式来使用LINQ方法。例如:
// assuming your Orders type has a Customer property
var query = data.AsQueryable().Select("Customer");
字符串表达式可能更复杂,例如使用.
运算符导航属性,使用[...]
进行数组索引:
// For each Order, will return the OtherAddress of the first Customer
var query = data.AsQueryable().Select("Customers[0].OtherAddress");
1。实际上,如果你真的想要,可以使用反射和System.Linq.Expressions.Expression
的组合来构建你自己的表达式。