我需要一种方法来实例化空的 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