2016-09-30 3 views
0

Code unten vor:Wie Attribut Eigenschaft anhängen zu konst Werte

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

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

I USER- Teil von const Werte entfernen möchten, weil ich es durch Category Attribut angeben. In diesem Fall gibt es eine Möglichkeit, USER-CREATE Wert zu erhalten, wenn ich Permissions.Create anrufen? Wenn nicht, wie erreicht man dieselbe Funktionalität mit einem anderen Ansatz?

bearbeiten

I const Werte verwenden, weil ich mit dem Attribut verwenden.

Zum Beispiel: [Attribute(Permissions.Create)]

Edit für meine realen Fall

Neuer Code nach @HimBromBeere vorschlagen

[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

Sie können einen 'const' Wert nicht ändern, deshalb nennt man das eine Konstante. Aber ich bin mir nicht sicher, was genau du willst. Sie wollen '' USER '' aus der Konstanten entfernen, aber trotzdem '' USER-CREATE '' bekommen, wenn * auf * diese Konstante zugegriffen wird? Sie müssten den Kategorienamen (gelesen von dem Attribut) mit dem "const" verketten, was für mich etwas übertrieben klingt. – HimBromBeere

+0

Wenn Sie konstante Werte haben, die von anderen Assemblies referenziert werden sollen, empfiehlt es sich, 'static readonly' zu verwenden, da der Wert bei der Kompilierung der abhängigen Assembly möglicherweise inline ist, wenn Sie' const' verwenden unbeabsichtigte Konsequenzen. Verwenden Sie nur 'public const' *, wenn Sie wirklich * benötigen (z. B. zur Verwendung in Attributkonstruktoren). – Dai

Antwort

1

Sie können eine private const innerhalb Ihrer Permissions -klasse definieren, die Sie Ihren tatsächlichen Konstanten hinzufügen.

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

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

Diese isn't genau das, was Sie wollen, aber vermeidet mindestens einige der Vervielfältigungen. Sie benötigen jedoch den Wert "USER" zweimal, einmal innerhalb des Attributs und einmal innerhalb des privaten const. Um dies zu vermeiden, müsste das Attribut ausgewertet werden, was eine Laufzeitoperation ist und in Ihrem Szenario nicht verwendet werden kann.

EDIT: Man könnte sogar die erste Linie durch diese ersetzen:

[Category(Permissions.KEYWORD)] 

Nun sind alle Vervielfältigungen von derselben Saite sind verschwunden.

+0

Ich aktualisierte die Frage basierend auf Ihrem Vorschlag. Wie Sie sehen, ist es nicht lesbar, aber es scheint, es gibt keinen Weg, dies zu tun. –

+0

Warum verwenden Sie nicht auch 'KEYWORD' im Attribut? –

+0

@WaiHaLee Ja, das ist auch aufgefallen und wurde aktualisiert. – HimBromBeere

0

absoulutely Sie können dies nicht tun. In den meisten Fällen werden Ihre konstanten Werte vom Compiler in der Kompilierungszeit berücksichtigt.

Verwenden Sie stattdessen statisch nur Qualifier. Sie können seinen Wert durch Reflexion frei ändern. Eine andere Lösung verwendet Aspekte. Zum Beispiel können Sie sehen, wie es in PostSharp gemacht wird. Basically wird es Ihre Binärdateien nachbearbeiten und Code in sie injizieren.

+0

Warum ein 'readonly' Member verwenden und es dann mit Reflection ändern? Entweder sei streng und ändere es nicht (das ist, was "readonly" bedeutet) oder änderbar ohne Modifizierer, in diesem Fall brauchst du keine Reflexion, um den Wert festzulegen. – HimBromBeere

+0

Aus Sicht des Entwurfs stimme ich Ihnen vollkommen zu. Aber ich denke, er hatte keine Wahl, aber tu es so. – eocron