gpt4 book ai didi

C# 属性 : Using enum constants as input parameters

转载 作者:太空狗 更新时间:2023-10-29 23:09:19 25 4
gpt4 key购买 nike

我正在尝试为我的 MVC 应用程序实现一种新的基于权限的访问方法;我们有几个权限组,每个组都包含一个权限列表。例如,我们有 Invoices 权限组,其中包含 CreateInvoice、RemoveInvoice 等 权限键。

在这种方法中,每个 mvc Action 都需要特定的执行权限。我正在尝试通过 CustomAttributes 来做到这一点,就像这样:

public class InvoiceController : Controller
{
[RequirePermission(Permissions.Invoices.CreateInvoice)]
public ActionResult Create()
{
return View();
}
}

为了让开发人员更容易记住不同的权限组和权限 key ,我正在尝试创建一个预定义的权限列表,它应该是权限组和权限 key 的组合。但由于在 C# 中使用属性参数的限制我还不能让它工作。 (我不想制作一个超大的枚举器并将所有权限 key 放在那里)

我最后的尝试是为每个权限组创建一个枚举器,然后在其中将权限键定义为枚举常量:

public class PermissionEnums
{
[PermissionGroup(PermissionGroupCode.Invoice)]
public enum Invoices
{
CreateInvoice = 1,
UpdateInvoice = 2,
RemoveInvoice = 3,
ManageAttachments = 4
}

[PermissionGroup(PermissionGroupCode.UserAccounts)]
public enum UserAccounts
{
Create = 1,
ChangePassword = 2
}
}

如您所见,我们这里有代码组合,使用 PermissionGroup 属性指定的权限组 key 和在每个枚举常量上指定为数字代码的权限 key 代码。

RequirePermission 属性定义如下:

public class RequirePermissionAttribute : Attribute
{
private Enum _Permission;

public RequirePermissionAttribute(Enum Permission)
: base()
{
_Permission = Permission;
}
}

但问题是 Enum 类型的对象不能用作属性参数。

感谢任何建议/想法

最佳答案

我找到了解决方案,唯一需要更改的是构造参数的类型。而不是使用 Enum 你必须使用 object :

public class RequirePermissionAttribute : AuthorizeAttribute
{
private object _Permission;

public RequirePermissionAttribute(object Permission)
: base()
{
_Permission = Permission;
}
}

完整代码如下:

/***************** Permission Groups And Keys *****************/
public static class Permissions
{
[PermissionGroup(PermissionGroupCode.Invoice)]
public enum Invoices
{
CreateInvoice = 1,
UpdateInvoice = 2,
RemoveInvoice = 3,
ManageAttachments = 4
}

[PermissionGroup(PermissionGroupCode.UserAccounts)]
public enum UserAccounts
{
Create = 1,
ChangePassword = 2
}
}

public enum PermissionGroupCode
{
Invoice = 1,
UserAccounts = 2,
Members = 3
}

/***************** Attributes & ActionFilters *****************/

[AttributeUsage(AttributeTargets.Enum)]
public class PermissionGroupAttribute : Attribute
{
private PermissionGroupCode _GroupCode;
public PermissionGroupCode GroupCode
{
get
{
return _GroupCode;
}
}

public PermissionGroupAttribute(PermissionGroupCode GroupCode)
{
_GroupCode = GroupCode;
}
}


public class RequirePermissionAttribute : AuthorizeAttribute
{
private object _RequiredPermission;

public RequirePermissionAttribute(object RequiredPermission)
: base()
{
_RequiredPermission = RequiredPermission;
}

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var permissionGroupMetadata = (PermissionGroupAttribute)_RequiredPermission.GetType().GetCustomAttributes(typeof(PermissionGroupAttribute), false)[0];

var groupCode = permissionGroupMetadata.GroupCode;
var permissionCode = Convert.ToInt32(_RequiredPermission);

return HasPermission(currentUserId, groupCode, permissionCode);
}
}

关于C# 属性 : Using enum constants as input parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com