我有一個對象,它是一個:如果對象實現該接口,我可以將IQueryable <Foo>傳入IQueryable <IFoo>嗎?
IQueryable<Foo>
,我想將它傳遞到期望一個函數:
IQueryable<IFoo>
foo的農具的IFoo
爲什麼不這樣編譯?轉換爲完成這項工作的最佳方法是什麼?
我有一個對象,它是一個:如果對象實現該接口,我可以將IQueryable <Foo>傳入IQueryable <IFoo>嗎?
IQueryable<Foo>
,我想將它傳遞到期望一個函數:
IQueryable<IFoo>
foo的農具的IFoo
爲什麼不這樣編譯?轉換爲完成這項工作的最佳方法是什麼?
在.NET 4 BCL中添加了同向和反向變量,並且不存在於.NET 3.5 BCL中。
可以解決此限制在3.5使用Select
操作投放到接口類型:
IQueryable<Foo> foos = ..;
myFunc(foos.Select(x => (IFoo)x));
編輯(從裏德的評論,下同):
IQueryable<Foo> foos = ..;
myFunc(foos.Cast<IFoo>());
的原因是因爲List<Foo>
是一個新的類正在生成,所以是List<IFoo>
...所以,編譯器與他們完成時,他們現在將是2全新的在你的項目中找到獨特的類。
編輯:一排序的解決方案:
你可以做的是這樣的:
var myIFooList = myFooList.Select(item => (IFoo)item).ToList();
除了由Stephen Cleary答案,你也可以使用OfType表達:
IQueryable<Foo> foos = GetFoos();
var ifoos = foos.OfType<IFoo>();
我想象的OfType
方法可能會快一點,因爲表達式是過濾集合按類型而不是鑄造。
Anthony Pegram在評論中提出了一個很好的觀察/觀點。下面是OfType<>
在100萬個項目集合的快速測試VS Cast<>
:
OfType Test
00:00:00.1034880
00:00:00.0966734
00:00:00.0969874
00:00:00.1318617
00:00:00.0984404
00:00:00.0970098
00:00:00.0981691
00:00:00.0972425
00:00:00.1330730
00:00:00.1239663
total: 00:00:01.0769116
avg: 00:00:00.1076911
Cast Test
00:00:00.0556266
00:00:00.0729768
00:00:00.0512704
00:00:00.0519060
00:00:00.0533288
00:00:00.0752939
00:00:00.0754975
00:00:00.0821554
00:00:00.0536814
00:00:00.0754732
total: 00:00:00.6472100
avg: 00:00:00.0647210
看到更新的問題,我有IQueryable的 – leora 2011-02-09 02:12:51
@ooo - 看到更新的答案。 – 2011-02-09 02:14:14
+1:我推薦使用`foo.Cast()`代替,雖然:http://msdn.microsoft.com/en-us/library/bb301460.aspx –
2011-02-09 02:20:23