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

继承Microsoft.Graph.User后无法强制类型转换的问题及解决办法问询

解决Microsoft.Graph.User转自定义子类oUser的类型转换问题

问题本质

你遇到的类型转换失败,核心原因和基类的受保护构造函数无关——面向对象中,只能将实际运行时类型为子类(或其子类)的对象,向下转换为该子类类型。你拿到的user对象实际类型是Microsoft.Graph.User,并非oUser,所以强制转换必然抛出异常。

可行解决办法

1. 给oUser添加复制构造函数

在自定义的oUser类中添加接收Microsoft.Graph.User的构造函数,手动复制所有需要的属性:

public class oUser : Microsoft.Graph.User
{
    public oUser(Microsoft.Graph.User user)
    {
        // 复制User类的属性
        Id = user.Id;
        DisplayName = user.DisplayName;
        Mail = user.Mail;
        // 其他需要的属性依次复制
    }
}

// 使用方式
oUser _User = new oUser(user);

2. 使用对象映射工具(如AutoMapper)

借助AutoMapper自动处理属性映射,减少手动复制的工作量:
首先配置映射:

var configuration = new MapperConfiguration(cfg => 
{
    cfg.CreateMap<Microsoft.Graph.User, oUser>();
});
IMapper mapper = configuration.CreateMapper();

然后执行转换:

oUser _User = mapper.Map<oUser>(user);

3. 编写扩展方法封装转换逻辑

通过扩展方法快速将Microsoft.Graph.User转换为oUser:

public static class UserExtensions
{
    public static oUser ToOUser(this Microsoft.Graph.User user)
    {
        return new oUser
        {
            Id = user.Id,
            DisplayName = user.DisplayName,
            Mail = user.Mail,
            // 其他属性
        };
    }
}

// 使用方式
oUser _User = user.ToOUser();

4. 改用组合模式替代继承

如果你的oUser不需要完整继承Microsoft.Graph.User的所有行为,考虑用组合方式包装原对象:

public class oUser
{
    private readonly Microsoft.Graph.User _innerUser;

    public oUser(Microsoft.Graph.User user)
    {
        _innerUser = user;
    }

    // 暴露需要的属性或方法
    public string Id => _innerUser.Id;
    public string DisplayName => _innerUser.DisplayName;

    // 自定义方法
    public void DoCustomOperation()
    {
        // 基于_innerUser实现逻辑
    }
}

内容的提问来源于stack exchange,提问作者MrCalvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:45:30