我正在制定索引越界错误,我理解为什么我会得到它。我正在寻找的可能是c#的一些功能我可能不知道而不是使用笨重的if / else语句。
如果Active Directory用户没有作业标题,则会输出该错误,因为它不会加载该属性,因此我甚至不知道rs.Propterties [“title”]。
有没有比if(rs.Properties [“title”]更简洁的方法。计数)
user.jobTitle = rs.Properties["title"][0].ToString();
我正在研究不同的运营商,比如?和?:但无法弄清楚如何使它们正常工作。
rs.Properties的类型为SearchResult:
使用System.DirectoryServices;
使用System.DirectoryServices.ActiveDirectory;
使用System.DirectoryServices.AccountManagement;
答案 0 :(得分:3)
怎么样:
user.jobTitle = (rs.Properties["title"].FirstOrDefault() ?? "").ToString();
假设rs.Properties["title"]
的类型为IEnumerable<object>
或类似的东西。如果只是IEnumerable
,则需要以下内容:
user.jobTitle = (rs.Properties["title"]
.Cast<object>()
.FirstOrDefault() ?? "").ToString();
如果集合为空,FirstOrDefault
调用将返回null。
(现在我们知道rs
的类型,看起来后者是必需的。)
您可能希望将其包装到您自己的扩展方法中,当然:
public static string GetFirstProperty(this SearchResult result,
string propertyName,
string defaultValue)
{
return result.Properties[propertyName]
.Cast<object>()
.FirstOrDefault() ?? defaultValue).ToString();
}
答案 1 :(得分:2)
选项1
user.jobTitle = rs.Properties.Contains("Title") ? rs.Properties["Title"][0].ToString() : string.Empty;
选项2
public static class SearchResultHelper
{
public static string GetValue(this SearchResult searchResult, string propertyName)
{
return searchResult.Properties.Contains(propertyName) ? searchResult.Properties[propertyName][0].ToString() : string.Empty;
}
}
通话看起来像
user.JobTitle = rs.Properties.GetValue("Title")
感谢AD示例的http://www.codeproject.com/KB/system/getuserfrmactdircsharp.aspx
答案 2 :(得分:1)
这是你要找的吗?
user.jobTitle = rs.Properties["title"]
.Cast<object>()
.FirstOrDefault()
.MaybePipe(x => x.ToString());
我到处使用的助手功能:
public static TResult MaybePipe(this T obj, Func<T, TResult> func)
{
return obj != null ? func(obj) : default(T);
}