2013-05-01 12 views
5

Ich möchte eine Eigenschaftszeichenfolge dem Attribut unten zuweisen.Wie kann ich einem Attribut eine Eigenschaft zuweisen

so Extraktion ist meine Zeichenfolge, aber ich möchte nicht hart Code in dort. Irgendwelche Vorschläge für eine bessere Weise zu vergeben

+0

Können Sie das Attribut auf die Eigenschaft selbst setzen? –

+0

Wie nennt man was? Es sieht so aus, als ob Sie eine Eigenschaft haben, die definiert, was als Schlüssel extrahiert werden soll, oder? Wenn Sie also ein Attribut 'KeyName' haben und es in die Eigenschaft einfügen, dann kann das, was die Extraktion ausführt, nach Ihrem' KeyName' -Attribut für die Eigenschaften der Klasse suchen und dann den Namen des Schlüssels aus der Eigenschaft erhalten, die dieses Attribut hat. Ist das sinnvoll? –

+0

@ChrisNielsen Ja, das macht Sinn, Kumpel ... Ich habe in const String und Zuweisung zu Attribut gegeben. – user1990395

Antwort

13

Sie können dies nicht tun.

Attributwerte müssen konstante Ausdrücke sein. Die Werte werden in den kompilierten Code eingebettet. Wenn Sie keinen konstanten Ausdruck verwenden möchten, können Sie kein Attribut verwenden ... und Sie sollten es möglicherweise nicht tun. Es kann bedeuten, dass Sie Attribute verwenden, wenn Sie einen anderen Ansatz verwenden sollten.

Vielleicht möchten Sie Eric Lipperts Blogpost unter properties vs attributes lesen.

Natürlich müssen Sie dort kein Zeichenfolgenliteral verwenden. Sie könnten haben:

[ExtractKey(ExtractionKeys.Extraction)] 
... 


public static class ExtractionKeys 
{ 
    public const string Extraction = "Extraction"; 
} 

... aber es ist immer noch eine Kompilierzeitkonstante.

+0

Vielen Dank für Ihre schnelle Antwort und lassen Sie mich durch den Link überprüfen – user1990395

+0

@ user190905: Ich fürchte, ich weiß nicht, was du meinst. Bitte klären Sie Ihren Kommentar und ich kann antworten. –

+0

Nur der Vollständigkeit halber ist eine weitere häufige (-ish) -Option zur Vermeidung von harten Literalen die Unterklassierung des Attributs, sodass die Unterklasse den tatsächlichen Wert zur Laufzeit im regulären Code auflösen kann. –

0

In Ihren Kommentaren sagen Sie, dass Sie alle (String-) Werte in einer statischen Klasse haben. Ist Ihre statische Klasse eine Klasse mit schreibgeschützten Eigenschaften? Ich meine, ändern sich die Werte? Wenn nicht, ersetzen Sie einige dieser Eigenschaften in Ihrer statischen Klasse durch Werte für konstante Zeichenketten. U kann diese Werte verwenden, um Ihr Attribut festzulegen.

So ...

static class MyClass 
{ 
    public string MyValue {get;} 
} 

würde:

static class MyClass 
{ 
    public const string MyValue= "MyValue"; 
} 

Jetzt kann Ihr Attribut wie folgt eingestellt werden:

[ExtractKey(MyClass.MyValue)] 
0

Wenn Sie die Eigenschaft des zu ändernden Attribut während der Laufzeit, dann können Sie dies mit diesem Code tun:

ExtractKeyAttribute myAttribute = typeof(Extract).GetCustomAttributes(typeof(ExtractKeyAttribute), false)[0] as ExtractKeyAttribute; 
myAttribute.MyValue = "MyRunTimeValue"; 
Verwandte Themen