0

我得到一个索引越界错误,我明白为什么我得到它。我正在寻找的可能是我可能不知道的 c# 的某些功能,而不是使用笨重的 if/else 语句。

如果 Active Directory 用户没有职位,则会出现此错误,因为它不会加载该属性,因此据我所知 rs.Propterties["title"] 甚至不存在。

有没有比 if (rs.Properties["title"].Count) 更清洁的方法

user.jobTitle = rs.Properties["title"][0].ToString();

我正在研究不同的运营商,比如?? 和?:但无法弄清楚如何让它们正常工作。

rs.Properties 的 SearchResult 类型来自:

使用 System.DirectoryServices;
使用 System.DirectoryServices.ActiveDirectory;
使用 System.DirectoryServices.AccountManagement;

4

3 回答 3

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();
}
于 2013-06-11T22:23:07.967 回答
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")

感谢http://www.codeproject.com/KB/system/getuserfrmactdircsharp.aspx的 AD 示例

于 2013-06-11T22:28:34.880 回答
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);
}
于 2013-06-11T22:22:57.833 回答