如何将Microsoft Graph API返回的DirectoryObject转换为Group类型?
解决DirectoryObject转Group的问题
正确的转换方式
方法1:使用Graph SDK的As<T>()扩展方法
Microsoft Graph SDK提供了专门的As<T>()扩展方法,用于将DirectoryObject转换为具体的实体类型(比如Group),该方法会自动处理ODataType的类型映射,比直接强制转换更可靠。修改后的代码如下:
private async Task<Dictionary<string, string>> GetGroupNames(List<string> groupIds) { var requestBody = new Microsoft.Graph.Groups.GetByIds.GetByIdsPostRequestBody { Ids = groupIds, Types = new List<string> { "group" } }; var result = await graphServiceClient.Groups.GetByIds.PostAsync(requestBody); var groups = result.Value!.Select(directoryObj => directoryObj.As<Group>()).Where(g => g != null).ToArray(); return groups.ToDictionary(g => g.Id!, g => g.DisplayName!); }
方法2:手动序列化反序列化
如果使用的是旧版本SDK,As<T>()扩展方法不可用,可以通过JSON序列化再反序列化的方式完成类型转换:
using System.Text.Json; private async Task<Dictionary<string, string>> GetGroupNames(List<string> groupIds) { var requestBody = new Microsoft.Graph.Groups.GetByIds.GetByIdsPostRequestBody { Ids = groupIds, Types = new List<string> { "group" } }; var result = await graphServiceClient.Groups.GetByIds.PostAsync(requestBody); var groups = new List<Group>(); foreach (var obj in result.Value!) { var json = JsonSerializer.Serialize(obj); var group = JsonSerializer.Deserialize<Group>(json); if (group != null) { groups.Add(group); } } return groups.ToDictionary(g => g.Id!, g => g.DisplayName!); }
关于指定Types = ["group"]的疑问
虽然调用的是Groups.GetByIds接口,但底层对应的Graph API是通用的/directoryObjects/getByIds,该接口支持返回多种目录对象类型(用户、组、应用等)。指定Types参数是为了明确告诉API仅返回组类型的对象,过滤掉其他类型的结果,同时能确保返回完整的组属性。即使在Groups命名空间下调用,该参数仍是必要的,因为接口的通用设计要求明确类型过滤条件。
内容的提问来源于stack exchange,提问作者user22433209
相关产品推荐
相关产品推荐

