如何实例化空SearchResultCollection,确保方法始终返回有效实例?
解决方案:获取合法空
SearchResultCollection的方法 因为SearchResultCollection没有公共构造函数,直接new是行不通的,我们可以通过执行一个必然返回空结果的AD搜索来获取一个有效的空实例——这种方式完全符合官方API规范,不需要Mock或者反射hack,完美适配你的需求。
具体实现思路
- 在异常捕获块中,创建一个新的
DirectorySearcher实例,指定一个永远不会匹配任何AD对象的过滤条件(比如一个不存在的对象类)。 - 调用它的
FindAll()方法,此时会返回一个空但完全有效的SearchResultCollection,调用者可以直接用foreach遍历,无需判断是否为null。
完整代码示例
public SearchResultCollection PerformAdSearch(DirectoryEntry searchRoot, string filter) { DirectorySearcher searcher = new DirectorySearcher(searchRoot, filter); try { return searcher.FindAll(); } catch { // 用绝对不匹配的过滤条件获取空的有效集合 var emptySearcher = new DirectorySearcher(searchRoot, "(objectClass=non-existent-ad-object-class)"); return emptySearcher.FindAll(); } }
关键注意事项
- 资源释放:
SearchResultCollection实现了IDisposable,无论返回的是正常结果还是空集合,调用者都应该用using语句确保资源被正确释放:using (var results = PerformAdSearch(searchRoot, filter)) { foreach (SearchResult result in results) { // 处理搜索结果 } } - 过滤条件的可靠性:要确保你选的过滤条件在AD环境中绝对不会匹配任何对象,比如上面的
non-existent-ad-object-class,避免意外返回数据。 - 性能影响:这个空搜索的开销极小,AD会快速判定无匹配对象,不会产生额外的网络或计算负担。
为什么不推荐其他方案?
List<SearchResult>替代:正如你所说,这会增加不必要的复杂度,调用者需要适配不同的集合类型,破坏了原有的AD搜索API使用习惯。- 反射创建实例:虽然能通过反射调用私有构造函数,但这种方式依赖.NET框架内部实现,版本更新后可能失效,属于不稳定的hack方案。
- Mock框架:你的需求明确禁止Mock,而且Mock实例在实际遍历等操作中可能存在行为不一致的问题。
内容的提问来源于stack exchange,提问作者user3158591
相关产品推荐
相关产品推荐

