В итоге я написал следующий код.
public class UserProfile
{
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty]
public string EmployeeID { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty]
public string GivenName { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty("SN")]
public string Surname { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty]
public string Company { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty]
public string Department { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty("CN")]
public string UserName { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty("Mail")]
public string Email { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
[ActiveDirectoryProperty]
public LanguageType Language { get; set; }
[DataMember(IsRequired = true, EmitDefaultValue = false)]
public DateTime? NextPasswordChangeDate { get; set; }
}
Затем я могу использовать отражение, чтобы получить старый «PropertiesToLoad», который сам по себе в основном безвреден, поскольку я использую отражение только один раз, чтобы заполнить массив после этого, мне больше не нужно вызывать GetProperties.
Осталось только проверить, могу ли я заполнить объект из SearchResult достаточно быстро, - но запрос AD обычно намного медленнее, чем некоторые операции в памяти, поэтому я с нетерпением жду результата , :)