You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实例化空SearchResultCollection,确保方法始终返回有效实例?

解决方案:获取合法空SearchResultCollection的方法

因为SearchResultCollection没有公共构造函数,直接new是行不通的,我们可以通过执行一个必然返回空结果的AD搜索来获取一个有效的空实例——这种方式完全符合官方API规范,不需要Mock或者反射hack,完美适配你的需求。

具体实现思路

  1. 在异常捕获块中,创建一个新的DirectorySearcher实例,指定一个永远不会匹配任何AD对象的过滤条件(比如一个不存在的对象类)。
  2. 调用它的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:04:19