You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:35:15