Raj*_*Rao 8 c# linq projection
是否可以使用Select to anonymous type进行投影?
这是一些示例代码
public interface ITest
{
string A{get;}
int B{get;}
}
string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };
IQueryable<ITest> query =
from n in names.AsQueryable()
select new {A = n.ToUpper(), B = 2012};
Run Code Online (Sandbox Code Playgroud)
上面的代码导致了
无法将类型'System.Linq.IQueryable'隐式转换为'System.Linq.IQueryable'
注意:如果我要定义一个实现ITest的类Test,然后使用以下方法投影到该类,我可以使上面的代码工作:
select new Test {A = n.ToUpper(), B = 2012};
Run Code Online (Sandbox Code Playgroud)
为什么?我试图看看我是否只能定义接口而不必定义对象的具体实现,并让Linq创建对象.
是的,您可以选择匿名类型,但不能同时选择匿名类型,然后使用这些对象,就像它们实现了一个接口一样.原因是匿名类型不实现接口,即使它们在类型和名称中具有相同的属性.没有办法定义匿名类型实现接口.如果要通过其接口实现使用对象,则必须选择实现该接口的具体类型.
匿名类型是直接从对象派生的类类型,不能转换为除object之外的任何类型.尽管您的应用程序无法访问它,但编译器为每个匿名类型提供了一个名称.从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别.
参考:http://msdn.microsoft.com/en-us/library/bb397696.aspx
我当然可以同情你的意图.如果编译器在类型是匿名的时候可以直觉知道类型符合接口定义,那将是很好的,但这实际上只适用于接口严格包含只读属性的情况.在接口使用setter或方法定义属性的那一刻,匿名类型无法实现它.另一方面,如果您正在使用匿名类型 - 作为特定用途的短期临时类型 - 您可以简单地引用它的属性,而您根本不需要该接口.
var query = from n in names.AsQueryable()
select new {A = n.ToUpper(), B = 2012};
foreach (var item in query)
{
Console.WriteLine( item.A );
}
Run Code Online (Sandbox Code Playgroud)