2016-09-30 59 views
0

考虑下面的代码:如何追加属性属性常量值

[Category("USER")] 
public class Permissions 
{ 
    public const string Create= "USER-CREATE"; 

    public const string Edit= "USER-EDIT"; 
    . 
    . 
} 

我想从常量的值删除USER-一部分,因为我通过Category属性指定。在这种情况下,有什么方法可以在拨打Permissions.Create时获得USER-CREATE的值?如果不是,如何实现与另一种方法相同的功能?

编辑

我,因为我将与属性要用就用常量的值。

例如:[Attribute(Permissions.Create)]

编辑对我的真实情况后@HimBromBeere

新的代码提示

[Permissions(Modules.Administration, HomePermissions.Category)] 
public class UserPermissions 
{ 
    private const string Category = "USER"; 

    private const string Prefix = Modules.Administration + "-" + Category + "-"; 

    public const string Create = Prefix + "CREATE"; 
    public const string Edit = Prefix + "EDIT"; 
} 
+4

您不能更改'const'值,这就是为什么它被称为常量。但我不确定你想要什么。你想从常量中删除'“USER”',但是当*访问那个常量时仍然会得到''USER-CREATE''?你将不得不将类名称(从属性中读取)与'const'连接起来,这对我来说听起来有点矫枉过正。 – HimBromBeere

+0

如果你有其他程序集引用的常量值,那么最好使用'static readonly',因为如果你使用'const',那么在编译相关程序集时可能会内联这个值,这会导致意想不到的后果。如果您确实需要*,只能使用'public const' *(例如,用于Attribute构造函数)。 – Dai

回答

1

您可以在您的Permissions-类中定义一个专用const,该类将添加到您的实际常量中。

[Category("USER")] 
public class Permissions 
{ 
    private const string KEYWORD = "USER"; 

    public const string Create= KEYWORD + "-CREATE";  
    public const string Edit= KEYWORD + "-EDIT"; 
} 

这isn't正是你想要的,但避免了重复至少一些。但是,您仍然需要两次,一次在属性内,一次在私人const内。避免这种情况需要对属性进行评估,这是一个运行时操作,并且不能在您的场景中使用。

编辑:你甚至可以通过此更换的第一行:

[Category(Permissions.KEYWORD)] 

现在相同的字符串的所有复制都不见了。

+0

我根据您的建议更新了问题。正如你所看到的,它不可读,但似乎没有办法做到这一点。 –

+0

为什么不在属性中使用'KEYWORD'? –

+0

@WaiHaLee是啊,也注意到这一点,并更新为拥塞。 – HimBromBeere

0

您absoulutely不能做到这一点。大多数情况下,编译器会在编译时将常量值内联。

取而代之,使用静态只读限定符。你可以通过反思自由地改变它的价值。

另一种解决方案将使用方面。例如,你可以看到它在PostSharp中如何完成。基本上它会后处理你的二进制文件并向其中注入代码。

+0

为什么使用'readonly'成员而不是使用反射来改变它?要么是严格的并且不要改变它(这就是readonly的意思),或者没有任何修饰符就可以改变,在这种情况下,你不需要反射来设置值。 – HimBromBeere

+0

从设计的角度来看,我完全同意你的看法。但我认为他没有选择,但这样做。 – eocron