实例化一个空的搜索结果集合



我需要一种方法来实例化空的 SearchResultCollection,以便无论方法中处理的任何异常如何,都可以保证调用方具有有效的 SearchResultCollection。

我不想模拟这里回答的任何内容:在课堂上内置的 Moq C#

我有一个类,它使用 DirectorySearcher.FindOne 或 DirectorySearcher.FindAll 方法进行各种 AD 搜索。

DirectorySearcher searcher = new DirectorySearcher(searchroot, filter);
try{
    return searcher.FindAll();
} catch {
    return new SearchResultCollection(); //No constructor that I find.   
}

根据设计决策,我希望每个方法都应该返回一个有效的(可能是空的)SearchResultCollection,即使AD抛出异常也是如此。 这样,调用方就可以使用 foreach 循环来处理,而不关心方法中的任何 null 返回对象。 换句话说,返回应是集合有效的返回记录或相同格式的空集合。

我的替代方案是使用一个有效的列表,但增加了复杂性而没有太多价值。

我也找不到 SearchResultCollection 的构造函数,但是如果搜索失败,您可以在 catch 中尝试使用默认值,该默认值将返回包含 0 个条目的集合。

        DirectorySearcher searcher;
        SearchResultCollection ret;
        try
        {
            //Unknown search request
            searcher = new DirectorySearcher(searchroot, filter);
            ret = searcher.FindAll();
        }
        catch
        {
            //Default known that will return a collection with 0 entries
            searcher = new DirectorySearcher(null, "");
            ret = searcher.FindAll();
        }
        return ret;

简短的回答是否定的,你不能。您可能会以某种方式捕获一个空SearchResultCollection,保留对它的静态引用并将其用作 api 中的回退值,但这完全奇怪,因为该集合实现了IDisposable并且最终应该被释放。

如果您不喜欢返回空列表,可以尝试创建扩展方法,例如 EmptyIfNull()

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> me)
{
    return me ?? new List<T>();
}
DirectoryHelper.FindAll().EmptyIfNull().foreach

最新更新