继承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
相关产品推荐
相关产品推荐

