这是一个出于好奇而不是必要的问题,并且不得不处理诸如SearchResultCollection
(在System.DirectoryServices
命名空间中)之类的 Active Directory (MS) 类型。
经常在代码中处理 AD 时,我发现我必须检查 null、Count、[0] 的值 .. 并转换我得到的内容 .. 同时希望通过 COM 的底层 AD 对象不会不要去噗等。
在Parallel.ForEach
最近玩了 with 之后 - 并且不得不传入 an IEnumerable<T>
,我想,看看我如何将 aSearchResultCollection
转换IEnumerable
为我自己的自定义类型可能会很有趣。在这种类型中,我会从SearchResult
对象中提取所有值并将它们粘贴到我自己的 .NET 托管代码中。然后我会取消DirectoryEntry
,DirectorySearcher
等等等等。
因此,已经确定执行 searchResultCollection.Cast() 以便为 Parallel.ForEach 提供其源代码是一个好主意,我添加了一个显式运算符用于转换为我自己的类型(我们就称之为' Item
')。
ParallelForEach
我在,中对此进行了测试var myItem = (Item)currentSearchResult
。
好时光,我的演员操作员被调用,一切正常。然后我想,做类似的事情会很好searchResultCollection.Cast<Item>()
。可悲的是,这不起作用,没有在演员阵容中遇到任何断点。
我做了一些谷歌搜索,发现了 Jon Skeet 回答的一个有用的帖子:
关键在于,使用 .Select(...) 强制显式强制转换操作。好的,但是,嗯。
我走了,也许是反汇编System.Core
-> System.Linq.Enumerable.Cast<TResult>
,我注意到这个“演员”实际上是在做一个“as”关键字转换:
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
{
IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
if (enumerable != null)
{
return enumerable;
}
if (source == null)
{
throw Error.ArgumentNull("source");
}
return CastIterator<TResult>(source);
}
我阅读了更多内容并发现了这一点:
这里的最佳答案指出' as
'不调用任何转换运算符..使用(强制转换)。语义上我觉得这有点奇怪,因为扩展方法被称为 cast.. 它不应该是强制转换吗?毫无疑问,这不会发生的一个很好的理由,有人知道它是什么吗?