2016-09-30 29 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