【发布时间】:2015-10-27 15:08:29
【问题描述】:
我正在使用Dynamic Linq。
我可以做到以下几点:
IQueryable<Person>().Select("new(Id as Id, FirstName + Surname as Name");
这会创建一个包含匿名类型的IQueryable(不是IQueryable<object>)。
但鉴于我有以下课程:
public class ListItem
{
public ListItem()
{
}
public ListItem(int id, string name)
{
this.Id = id;
this.Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
我想通过调用ListItem的构造函数,直接从我的IQueryable<Person>中选择进入这个类型,相当于如下:
IQueryable<Person>().Select(p => new ListItem(p.Id, p.FirstName + p.Surname));
我尝试过以下变体:
// Illegal - new expects form "new()" - exception "'(' expected"
IQueryable<Person>().Select("new ListItem(Id, FirstName + Surname)");
// this doesn't work, "No property 'ListItem' exists on type 'Person'"
IQueryable<Person>().Select("ListItem(Id, FirstName + Surname)");
// this doesn't work because "[" is not expected
IQueryable<Person>().Select("[MyProject.Utils.ListItem,MyProject]()");
我相信这可以从文档available here:
方法、构造函数和索引器的重载解析使用类似于 C# 的规则。用非正式的术语来说,重载决策将选择最佳匹配方法、构造函数或索引器,或者如果无法识别单个最佳匹配,则报告歧义错误。
请注意,构造函数调用不以 new 为前缀。
这是可能的还是我误解了文档?
【问题讨论】:
-
为什么要为此使用 DynamicLinq 而不仅仅是 LINQ?
标签: c# linq dynamic constructor invocation