这是出于好奇而不是出于必要的问题,并且是不得不处理诸如SearchResultCollection
(在System.DirectoryServices
名称空间中)之类的Active Directory(MS)类型的问题。
通常,在代码中处理AD时,我发现我必须检查null,Count,[0] ..的值,然后转换我得到的结果..一直希望通过COM进行底层AD对象不会。不要po等
在最近玩过Parallel.ForEach
并必须传递IEnumerable<T>
之后,我想,看看如何将SearchResultCollection
转换为自己的自定义类型的IEnumerable
也许会很有趣。在这种类型中,我将从SearchResult
对象中提取所有值,并将其粘贴在我自己的.NET托管代码中。然后我将取消DirectoryEntry
,DirectorySearcher
等。
因此,已经知道为提供Parallel.ForEach的源而执行searchResultCollection.Cast()是一个好主意,我添加了一个显式运算符以强制转换为自己的类型(我们将其称为“ Item
” )。
我在ParallelForEach
,var myItem = (Item)currentSearchResult
中对此进行了测试。
好时机,我的演员操作员被叫来并且一切正常。然后我想,做类似searchResultCollection.Cast<Item>()
的事情会很好。不幸的是,这没有用,在转换运算符中没有遇到任何断点。
我做了一些谷歌搜索,发现了一个有用的帖子,乔恩·斯基特回答了:
IEnumerable.Cast<>
症结所在,使用.Select(...)强制执行显式强制转换操作。好的,但是,嗯。
我离开并可能反汇编了System.Core
-> System.Linq.Enumerable.Cast<TResult>
,我注意到此“ cast”实际上是在幕后进行“ 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);
}
我读了更多,发现了这一点:
Implicit/Explicit conversion with respect to the "as" keyword
此处的最高答案指出,“
as
”不调用任何转换运算符..使用(强制转换)。从语义上来说,我发现这有点怪异,因为扩展方法称为强制转换。它不应该强制转换吗?毫无疑问,这确实是一个很好的理由,为什么任何人都不会知道呢? 最佳答案
即使它使用了强制转换运算符而不是as
,它也不会调用用户定义的显式运算符,因此这无关紧要。唯一的区别是引发异常的类型。
在运行时根本不知道显式运算符。根据CLR,无法将搜索结果强制转换为Item
。当编译器注意到存在与给定显式运算符匹配的强制转换时,它将在编译时将对该显式运算符的调用(基本上是静态方法)注入代码中。一旦进入运行时,就不会剩下任何有关转换的知识,只需使用一个方法调用即可处理转换。
因为这是显式运算符的实现方式,而不是向运行时提供如何进行转换的知识,所以Cast
无法将显式运算符的调用注入代码中。它已经被编译了。当编译它时,不知道要插入任何显式运算符,因此没有注入。
关于c# - 强制转换为自定义类型Enumerable.Cast <T>和as关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21607387/