.NET 4.8中使用MsGraph无法从DirectoryObject提取sAMAccountName
问题分析与解决方案
问题根源
你遇到的NullReferenceException是因为反射调用时使用的属性名格式错误:
- 你传入的
onPremisesSamAccountName是小驼峰格式,但C# CLR属性采用PascalCase(首字母大写)命名,实际属性名为OnPremisesSamAccountName,导致GetProperty返回null,后续调用GetValue触发空引用异常。 - 而
DisplayName、UserPrincipalName你用了首字母大写的正确格式,所以能正常获取属性值。
解决方案
方案一:修正反射属性名
将调用反射方法的参数改为首字母大写的正确格式:
user.ManagerUpperID = GetDirObjPropertyValue(manager, "OnPremisesSamAccountName");
方案二:使用强类型访问(推荐)
经理对象本质是User类型,直接转换后访问强类型属性,完全避免反射的潜在问题:
GraphServiceClient graphServiceClient = this.GetGraphServiceClient(); var managerInfo = await graphServiceClient.Me.Manager .Request() .Select("onPremisesSamAccountName,displayName,jobTitle,userPrincipalName,directreports") .GetAsync(); var managerUser = managerInfo as User; if (managerUser != null) { user.ManagerUpperEmail = managerUser.UserPrincipalName; user.ManagerUpperName = managerUser.DisplayName; user.ManagerUpperID = managerUser.OnPremisesSamAccountName; }
优化反射方法(可选)
给反射方法增加空判断,避免后续再出现类似空引用问题:
private string GetDirObjPropertyValue(DirectoryObject dObj, string key) { var property = dObj.GetType().GetProperty(key); if (property == null) return null; var value = property.GetValue(dObj, null); return value?.ToString(); }
内容的提问来源于stack exchange,提问作者bregia
相关产品推荐
相关产品推荐

