在MSDN文档中找不到任何关于此的内容.
也就是这样做,说:
using(PrincipalSearcher searcher = ...)
{
foreach (var principal in searcher.FindAll())
{
... do something ...
} // The PrincipalSearchResult<T> returned by searcher.FindAll is disposed here
}
Run Code Online (Sandbox Code Playgroud)
这是我见过的大多数例子,或者我应该这样做:
using(PrincipalSearcher searcher = ...)
{
foreach(var principal in searcher.FindAll())
{
using (principal)
{
// ... do something ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
后者(在迭代期间明确地处理每个项目)看起来"更安全" - 即符合指南以明确处理所有IDisposable对象 - 但它有点凌乱; 例如,它排除了使用LINQ迭代搜索结果.
回应@Rup的评论:
你可以编写一个从父迭代器返回一个结果的yield迭代器
是的,我认为这样可以启用LINQ.像下面的扩展方法:
public static IEnumerable<T> EnumerateAndDispose<T>(this IEnumerable<T> collection) where T : IDisposable
{
foreach (T item in collection)
{
using (item)
{
yield …
Run Code Online (Sandbox Code Playgroud) 我对 UserPrincipal 类进行扩展以检索我需要的一些缺失的属性:
[DirectoryObjectClass("user")]
[DirectoryRdnPrefix("CN")]
class UserPrincipalExt : UserPrincipal
{
public UserPrincipalExt(PrincipalContext context)
: base(context)
{
}
[DirectoryProperty("department")]
public string Department
{
get
{
if (ExtensionGet("department").Length != 1)
return null;
return (string)ExtensionGet("department")[0];
}
set
{
this.ExtensionSet("department", value);
}
}
[DirectoryProperty("company")]
public string Company
{
get
{
if (ExtensionGet("company").Length != 1)
return null;
return (string)ExtensionGet("company")[0];
}
set
{
this.ExtensionSet("company", value);
}
}
[DirectoryProperty("c")]
public string CountryAbbreviation
{
get
{
if (ExtensionGet("c").Length != 1)
return null;
return (string)ExtensionGet("c")[0];
}
set
{
this.ExtensionSet("c", …
Run Code Online (Sandbox Code Playgroud) c# active-directory userprincipal principalsearcher groupprincipal