如何用泛型实现兼容两个枚举的TeamsAppPermissionPolicy存在性检查
问题描述
我有两个不同的枚举类型,代码如下:
public enum TeamsUserPolicyType { OnlineDialinConferencingPolicy, OnlineVoiceRoutingPolicy, TeamsAppPermissionPolicy, //Called as AppsPermission in UserAssignedSettingType TeamsAppSetupPolicy } public enum UserAssignedSettingType { Meeting, MeetingBranding, AppsSetup, AppsPermission,//Called as TeamsAppPermissionPolicy in TeamsUserPolicyType EventsPolicy, TeamsRoomVideoTeleConferencingPolicy }
目前我实现了一个方法,用来检查枚举列表中是否存在对应权限策略:
private bool HasTeamsAppPermissionPolicy(IList<UserAssignedSettingType> userPolicyTypes) { var hasuserAppPermPolicy = userPolicyTypes.Contains(UserAssignedSettingType.AppsPermission); return hasuserAppPermPolicy; }
我希望这个方法能同时支持两种枚举类型:传入IList<UserAssignedSettingType>时执行上述逻辑;传入IList<TeamsUserPolicyType>时,检查的目标值改为TeamsUserPolicyType.TeamsAppPermissionPolicy。我知道可以通过重载方法实现,但想了解有没有更优的泛型实现方式。
泛型实现方案
可以通过泛型方法+枚举类型映射的方式实现,既避免重复代码,又能灵活支持两种枚举类型。核心思路是预定义类型与目标枚举值的关联关系,再统一执行检查逻辑。
实现代码(映射字典版)
// 预定义枚举类型与对应检查目标值的映射 private static readonly Dictionary<Type, object> _permissionPolicyMap = new Dictionary<Type, object> { { typeof(UserAssignedSettingType), UserAssignedSettingType.AppsPermission }, { typeof(TeamsUserPolicyType), TeamsUserPolicyType.TeamsAppPermissionPolicy } }; private bool HasTeamsAppPermissionPolicy<TEnum>(IList<TEnum> userPolicyTypes) where TEnum : Enum { if (!_permissionPolicyMap.TryGetValue(typeof(TEnum), out var targetPolicy)) { // 可根据业务需求选择返回false或抛出异常 throw new NotSupportedException($"不支持的枚举类型:{typeof(TEnum).Name}"); } return userPolicyTypes.Contains((TEnum)targetPolicy); }
实现代码(模式匹配版)
如果不想维护字典,也可以直接在泛型方法中通过模式匹配判断类型:
private bool HasTeamsAppPermissionPolicy<TEnum>(IList<TEnum> userPolicyTypes) where TEnum : Enum { return typeof(TEnum) switch { Type t when t == typeof(UserAssignedSettingType) => userPolicyTypes.Contains((TEnum)(object)UserAssignedSettingType.AppsPermission), Type t when t == typeof(TeamsUserPolicyType) => userPolicyTypes.Contains((TEnum)(object)TeamsUserPolicyType.TeamsAppPermissionPolicy), _ => throw new NotSupportedException($"不支持的枚举类型:{typeof(TEnum).Name}") }; }
方案优势
- 避免重复编写
Contains检查逻辑,代码更简洁易维护。 - 后续新增同类型的枚举检查需求时,只需扩展映射字典或模式匹配分支,无需新增重载方法。
内容的提问来源于stack exchange,提问作者Programmerzzz
相关产品推荐
相关产品推荐

