实例化一个空的SearchResultCollection

时间:2019-01-18 20:37:57

标签: c# active-directory

我需要一种实例化一个空的SearchResultCollection的方法,以确保无论方法中处理了什么异常,调用者都可以保证获得有效的SearchResultCollection。

我不希望在此处模拟任何回答:Moq C# built in class

我有一个使用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返回对象。换句话说,退货应为有效退货记录的集合或相同格式的空集合。

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

2 个答案:

答案 0 :(得分:0)

简短的回答是“否”,您不能。您可能会以某种方式捕获一个空的SearchResultCollection,对其进行静态引用,并将其用作API中的后备值,但是由于该集合实现了IDisposable,因此将其完全抛弃,应该将其最终处置。 >

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

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

DirectoryHelper.FindAll().EmptyIfNull().foreach

答案 1 :(得分:0)

我也找不到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;