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只是一组权限,基本上是所有权限组的列表。它将返回权限的掩码(对于该枚举)