我需要一种实例化一个空的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返回对象。换句话说,退货应为有效退货记录的集合或相同格式的空集合。
我的替代方法是使用一个有效的列表,但会增加复杂性而没有太多价值。
答案 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;