C# 希望使该许可证系统通用,以减少重复代码等

C# 希望使该许可证系统通用,以减少重复代码等,c#,generics,permissions,refactoring,C#,Generics,Permissions,Refactoring,我有一组枚举,它们表示应用程序各个部分的权限 public enum PermissionGroup1 { CanDo11, CanDo12, CanDo13, } public enum PermissionGroup2 { CanDo21, CanDo22, CanDo23, } public enum PermissionGroup3 { CanDo31, CanDo32, CanDo33, } 对于给定用

我有一组枚举,它们表示应用程序各个部分的权限

public enum PermissionGroup1 
{
    CanDo11,
    CanDo12,
    CanDo13,
}

public enum PermissionGroup2 
{
    CanDo21,
    CanDo22,
    CanDo23,
}

public enum PermissionGroup3 
{
    CanDo31,
    CanDo32,
    CanDo33,
}
对于给定用户,我收集了该用户的所有权限,然后使用如下方法检查权限:

public Boolean CheckXXXAccess(int ModuleID, PermissionGroupX permission)
    {
        bool hasAccess = false;

        if (!m_Permissions.ContainsKey(ModuleID))
        {
            hasAccess = false;
        }
        else
        {
            hasAccess = (permission == (ModulePermissions[ModuleID].PermissionGroupX & permission));
        }

        return hasAccess;            
    }
为了进一步解释,数据库包含一个ModuleID(对于给定的模块类型有一个PermissionGroup枚举),然后我为每个模块类型提供了一个类似CheckXXXAccess的方法


如何使用泛型生成单个方法而不是重复它?

我以这种方式实现了它

假设
Perms
是您的
ModulePermissions[ModuleID]
对象的类。然后,您可以像这样委托检查对它的访问:

public bool CheckAccess<T>(int moduleId, T perm) {
    if(!ModulePermissions.ContainsKey(moduleId)) return false;
    return ModulePermissions[moduleId].HasPermission(perm);
}
bool b1 = CheckAccess(1, PermissionGroup1.CanDo11);
bool b2 = CheckAccess(3, PermissionGroup3.CanDo32);
这样,您就可以像这样使用新的
CheckAccess
方法:

public bool CheckAccess<T>(int moduleId, T perm) {
    if(!ModulePermissions.ContainsKey(moduleId)) return false;
    return ModulePermissions[moduleId].HasPermission(perm);
}
bool b1 = CheckAccess(1, PermissionGroup1.CanDo11);
bool b2 = CheckAccess(3, PermissionGroup3.CanDo32);

当然,您可以根据您的代码规则重写
HasPermission
GetPerm
方法(例如,无动态和有反射)。

在我看来,最好将枚举更改为类,而不是使用不同的枚举,使用不同的类和一个枚举(使用不同的访问级别,例如Level1、Level2,…可能是将来的额外级别),并且所有这些类都继承自基类(如PermissionAccessBase),基类有一个方法(当前包含此信息):CheckAccess(作为虚拟),以及一个类型为Access Level Enum的属性,所有其他类将以它们想要的方式继承它(可以重写基方法,但您可以有机会调用基方法)


这并没有减少您应该编写的函数的数量,但是您可以将方法的公共部分放在基方法中,并在重写的方法中调用它,这也会导致概念分离,我认为您当前用于检查权限的类没有用于检查权限,如果是这样,则会收集所有不同的权限类型检查在一个不好的类中。

什么是
ModulePermissions
,或者更具体地说,
ModulePermissions[ModuleID]
返回什么?ModulePermissions只是一组权限,基本上是所有权限组的列表。它将返回权限的掩码(对于该枚举)