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

如何用泛型实现兼容两个枚举的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:18:29