An attribute argument must be a constant expression...

21/11/2007 - 07:19 von Anas | Report spam
Hallo,

Im folgenden Code habe ich das Validation Applikation block verwendet.

const Message = "test";
private string userName;
[StringLengthValidator(1, 50, Ruleset = "RuleSetA", MessageTemplate=Message)]
public string UserName
{
get { return userName; }
set { userName = value; }
}

Ich habe meine eigene Klasse definiert, damit alle Strings in meiner
Applikation lokalisiert werden können.

Also ich möchte mein String nicht so definieren:
const Message = "test";
sondern so:
string Message = myLocalizationClass.Map("test");

Mit dieser Schreibweise bekomme ich natürlich die folgende Fehlermeldung
"An attribute argument must be a constant expression, typeof expression or
array creation expression of an attribute parameter type)

Hat man vielleicht eine Idee, wie ich dieses Problem lösen kann?

Vielen Dank
 

Lesen sie die antworten

#1 Günter Prossliner
21/11/2007 - 17:08 | Warnen spam
Hallo Anas!

Im folgenden Code habe ich das Validation Applikation block verwendet.

const Message = "test";
private string userName;
[StringLengthValidator(1, 50, Ruleset = "RuleSetA",
MessageTemplate=Message)] public string UserName
{
get { return userName; }
set { userName = value; }
}

Ich habe meine eigene Klasse definiert, damit alle Strings in meiner
Applikation lokalisiert werden können.

Also ich möchte mein String nicht so definieren:
const Message = "test";
sondern so:
string Message = myLocalizationClass.Map("test");

Mit dieser Schreibweise bekomme ich natürlich die folgende
Fehlermeldung "An attribute argument must be a constant expression,
typeof expression or array creation expression of an attribute
parameter type)




Da ein Attribut (und dessen Argumente) direkt in die Metadaten des Assembly
einkompiliert werden, und diese verfügbar sind (bzw. sein müssen), ohne dass
das Assembly ausgeführt wird, können bei der Attributierung nur konstante
Ausdrücke (typeof(XYZ) ist auch konstant - entspricht einem typeref auf
Metadaten-Ebene) verwendet werden.

Das ist nicht zu àndern.

Was tu ggf. tun kannst (ich kenne diese Application Block nicht konkret,
deshalb kann ich Dir nur allgemeine Hinweise geben):

* Erlauben die Attribute Vererbung? Ein Beispiel dafür wàre das
System.ComponentModel.DescriptionAttribute. Das "Description" Property ist
virtuell. Deshalb ist es möglich in einer Ableitung das so zu überschreiben,
dass eine Lokalisierung möglich ist. So kann z.b. im Attribut selbst nur ein
sprachunanhàngiger Ressource-Key stehen. Die Implementierung làd dann den
lokalisierten String aus einer Ressource-Datei (diese Variante wird auch im
Framework intern verwendet).

Eventuell ist das bei dem "StringLengthValidatorAttribute" (welches ich
nicht nàher kenne) auch möglich.


* Gibt es eventuell im Validation Block eine andere Möglichkei das
Lokalisierung? Ich könnte mir z.b. vorstellen, dass es eine Form vom
Callback / Event Mechanismus gibt, in welchen Du die Möglichkeit hast die
Texte zu àndern / zu lokalisieren.



mfg GP

Ähnliche fragen