2016-09-30 2 views
0

Рассмотрим ниже код:Как добавить атрибут свойство Const значения

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

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

Я хочу, чтобы удалить USER- часть из константных значений, потому что я указать его Category атрибута. В этом случае есть ли способ получить значение USER-CREATE, когда я звоню Permissions.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', поэтому его называют константой. Но я не уверен, что именно ты хочешь. Вы хотите, чтобы t удалял '' USER ''из константы, но все еще получал' 'USER-CREATE' 'при * доступе * к этой константе? Вам нужно было бы связать имя категории (прочитанное от атрибута) с помощью 'const', который звучит немного для меня. – HimBromBeere

+0

Если у вас есть постоянные значения, на которые ссылаются другие сборки, лучше использовать 'static readonly', потому что если вы используете' const', тогда значение может быть встроено во время компиляции зависимой сборки, что может привести к непреднамеренные последствия. Используйте только 'public const' *, если вам действительно нужно * (например, для использования в конструкторах атрибутов). – Dai

ответ

1

Вы можете определить частный const в пределах вашего Permissions-класса, который вы добавляете к фактическим константам.

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

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

Это не правда, что именно вы хотите, но избежать, по крайней мере некоторые из дупликации. Однако вам все равно нужно значение "USER" дважды, один раз в пределах атрибута и один раз в приватном const. Чтобы избежать этого, потребуется атрибут, который будет оцениваться, который является операцией во время выполнения, и это не может использоваться в вашем сценарии.

EDIT: Можно даже заменить самую первую строку этим:

[Category(Permissions.KEYWORD)] 

Теперь все повторы одного и того же строки исчезли.

+0

Я обновил вопрос на основе вашего предложения. Как вы видите, это не читаемо, но кажется, что нет никакого способа сделать это. –

+0

Почему бы не использовать 'KEYWORD' в атрибуте тоже? –

+0

@WaiHaLee Да, также заметил это и обновил, как заговорил. – HimBromBeere

0

Вы absoulutely не можете это сделать. В большинстве случаев ваши постоянные значения будут встроены компилятором во время компиляции.

Вместо этого используйте static readonly квалификатор. Вы можете свободно изменять его значение через отражение.

Другое решение будет использовать аспекты. Например, вы можете увидеть, как это делается в PostSharp. В основном он будет обрабатывать ваши двоичные файлы и вводить в них код.

+0

Зачем использовать 'readonly' член, а не изменять его с помощью отражения? Либо будьте строгими и не меняйте его (это то, что «readonly' для), или изменено без какого-либо модификатора, в этом случае вам не нужно отражать, чтобы установить значение. – HimBromBeere

+0

С точки зрения дизайна, я полностью согласен с вами. Но я думаю, что у него не было выбора, но так оно и делалось. – eocron

Смежные вопросы