I ended up writing the following code.
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; } }
Then I can use reflection to get the old "PropertiesToLoad", which itself is basically harmless, since I use reflection only once to fill the array after that, I no longer need to call GetProperties.
The only thing that remains to be checked: if I can fill out the object from SearchResult fast enough, but, tbh, the AD query is usually slower than some RAM operations, so I look forward to the result :)
source share