【问题标题】:Create IQueryable of Unknown Type from IList at Runtime在运行时从 IList 创建未知类型的 IQueryable
【发布时间】:2013-02-20 20:01:28
【问题描述】:

我有一个 IList 类型的实体。

我有一个字符串表示从实体派生的类的类型。

我需要使用字符串将我的 IList 转换为从 Entity 派生的 Type 的 IQueryable。

遗憾的是,Entity 和派生类的程序集不是正在执行的程序集。

【问题讨论】:

  • 你能打电话给.AsQueryable()吗? stackoverflow.com/questions/73542/ilistt-to-iqueryablet
  • 我需要它是从运行时未知的实体派生的类型。
  • 我可能遗漏了一些东西,但如果在运行时不知道,这怎么可能呢?如何从环境不可用的类型创建对象?
  • @nerdperson 你需要更简洁。是 IList 还是 IList<Entity>?整个字符串“表示类型”是类型的程序集限定名称(即“namespace.type,程序集”)?
  • 您的列表实例是 IList 还是 IList

标签: c# reflection iqueryable


【解决方案1】:

这是动态 linq 和反射的方法

var list = new List<Company>()
{
    new Company { Foo = "1", NoEmployees = 1 },
    new Company { Foo = "3", NoEmployees = 3 }
};

MethodInfo method = typeof(Queryable).GetMethods().Where(x => x.Name == "AsQueryable" && x.IsGenericMethod).First();
MethodInfo generic = method.MakeGenericMethod(new Type[] { Type.GetType(typeString) });

var queryable = (IQueryable)generic.Invoke(null, new object[] { list });

var result = queryable.Select("new (NoEmployees)").Where("NoEmployees > 2").OfType<object>().ToList();

下次请更明确

【讨论】:

  • 部分“var result = queryable.Select("new (NoEmployees)").Where("NoEmployees > 2").OfType().ToList();"不编译? @alexb
  • 如何将字符串作为谓词传递,然后对其进行评估和执行,这一切都是动态发生的?
  • 谢谢@alexb,您不认为您的回答也应该“更明确”吗?大声笑
  • 是的,我想:)。虽然我认为动态 linq 库很受欢迎,但也许这只是我的看法
【解决方案2】:

请提供更多信息,这是我能想到的唯一可能是您想要的。

var queryable = new List<dynamic>();
foreach(var entity in IList<Entity>)
{
    dynamic companyProfile = Convert.ChangeType(entity, Type.GetType(typeString));
    if (companyProfile.CompanyProfileId == "something")
        queryable.Add(companyProfile);
    // Do Stuff
}
// Do Stuff

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2016-01-25
    • 2011-12-09
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多