我使用了这个答案的修改版本:How to dynamically create a class in C#?来创建一个表示类型化类的动态对象。
public static object CreateNewObject(string[] columnNames)
{
var myType = CompileResultType(columnNames);
return Activator.CreateInstance(myType) as IQueryable;
}
然后在主app:
var obj = MyTypeBuilder.CreateNewObject(rs.ColumnNames);
我需要以某种方式将其转换为IQueryable
,以便我可以执行一些Linq调用,例如.where()
,.select()
等。当然,我目前无法做到,因为我的应用程序不知道该对象的确切内容,或者该对象是什么。
所以我需要的是:
var obj = MyTypeBuilder.CreateNewObject(rs.ColumnNames);
List<obj> aListICanFill = new List<obj>();
..
aListICanFill.where(x => x.Equals("")).take(3);
我盲目地尝试了不同的演员阵容,甚至未能尝试通过对象进行迭代 - 现在我完全陷入困境。
有没有办法做到这一点?
http://msdn.microsoft.com/en-us/library/bb882637.aspx似乎是我应该抓住的东西 我的对象是什么样的:
答案 0 :(得分:1)
如果您可以使用List&lt; dynamic&gt;你可以使用Where和Select IEnumerable&lt; T&gt;扩展方法如下。这不适用于IQueryable,因为这些方法需要一个不能动态的表达式。
using System;
using System.Collections.Generic;
using System.Linq;
namespace DynamicListTest
{
internal class Program
{
private static void Main(string[] args)
{
var dynamicObjects = GetDynamicObjects().Cast<dynamic>().AsEnumerable();
var itemsToPrint = dynamicObjects
.Where(item => item.Age > 30);
foreach (var item in itemsToPrint)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
private static IQueryable GetDynamicObjects()
{
return new List<dynamic>()
{
new { Name = "A", Age = 10 },
new { Name = "B", Age = 20 },
new { Name = "C", Age = 30 },
new { Name = "D", Age = 40 },
new { Name = "E", Age = 50 },
}.AsQueryable();
}
}
}
打印
{姓名= D,年龄= 40}
{姓名= E,年龄= 50}
答案 1 :(得分:0)
检查linq到对象
http://msdn.microsoft.com/en-us/library/bb397919.aspx
希望你的对象包含一个数组?
你能举例说明你想如何查询吗?还有CompileResultType的作用吗?
var myType = CompileResultType(columnNames);
编辑
供将来参考 - 正如Shane所建议 - OP正在尝试 - Dynamic Linq dynamiclinq.codeplex.com