我有一堆枚举,代表了应用程序各个部分的权限。
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的方法。
如何使用泛型制作单一方法而不是重复方法?
答案 0 :(得分:2)
我已经这样实现了。
说Perms
是你的ModulePermissions[ModuleID]
对象的类。然后你可以像这样委托对它的检查访问:
public bool CheckAccess<T>(int moduleId, T perm) {
if(!ModulePermissions.ContainsKey(moduleId)) return false;
return ModulePermissions[moduleId].HasPermission(perm);
}
Perms
实施:
public class Perms {
List<object> perms = new List<object>();
public bool HasPermission<T>(T perm) {
return perm == (GetPerm(typeof(T)) & perm);
}
dynamic GetPerm(Type permType) {
foreach(var item in perms) {
if(item.GetType() == permType)
return item;
}
throw new Exception();
}
}
这样您就可以使用新的CheckAccess
方法:
bool b1 = CheckAccess(1, PermissionGroup1.CanDo11);
bool b2 = CheckAccess(3, PermissionGroup3.CanDo32);
当然,您可以根据您的代码规则重写HasPermission
和GetPerm
方法(例如,没有动态和反射)。
答案 1 :(得分:1)
IMO最好将您的枚举更改为类,而不是具有不同的枚举,具有不同的类和一个枚举(具有不同的访问级别,例如Level1,Level2,......可能是未来的一些额外级别),并且所有这个类继承自基类(如PermisionAccessBase),它有一个方法(目前有这个信息):CheckAccess(作为虚拟),一个属性类型为Access Level Enum,所有其他类以他们想要的方式继承它(可以覆盖基本方法但你有机会打电话给你的基地。)
它不会减少你应该编写的函数的数量,但你可以将基本方法的常用部分放在基本方法中,并在覆盖的方法中调用它,也导致概念分离,我认为你目前使用的类是检查权限不用于检查权限,如果是,则在一个类中收集的所有不同的权限类型检查都不好。