Laden...

Func<T> als Attributs-Parameter

Erstellt von ..Heinz.. vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.029 Views
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren
Func<T> als Attributs-Parameter

Hallo,

ist es möglich, ein Func<T> als Parameter eines Attributs zu definieren?

Ich möchte ein Property mit einem Attribut ausstatten, das eine Überprüfung des Proertywertes durchführt. Dafür habe ich mir einen Validator gebaut.

Nun würde ich jedoch den Validationsvorgang dynamisch gestalten, so dass ich eine eigene Funtion (die immer bool zurück gibt) definieren und in das Attribut schreiben kann.

[ValidationAttribute(() => {...}, ErrorMessage = "...")]
public string Name { get; set; }

Wenn ich das Property attributiere bekomme ich die Fehlermeldung: > Fehlermeldung:

Der Ausdruck kann keine anonymen Methoden oder lambda-Ausdrücke enthalten.

Ist mein Vorhaben möglich?

1.361 Beiträge seit 2007
vor 12 Jahren

Hi Heinz,

die Parameter-Typen, die du einem Attribut mitgeben kannst sind sehr beschränkt.
Im Grunde nichts dynamisch erzeugtes, was erst noch ein Objekt erstellt. Also grob gesagt nur 'konstante Literale'.

Der Stackoverflow Artikel 'How to pass objects into an attribute constructor' fasst das gut zusammen und liefert auch einen Workaround.

Denn Typeof-Ausdrücke sind möglich. Also stecke deinen Code in ein Objekt und gib diesen Typ dem Attribut mit.


class MyStringValidator
{
 public bool Validate(string s) {...}
}
[ValidationAttribute(typeof(MyStringValidator), ErrorMessage = "...")]
public string Name { get; set; }

Im Code musst du dann per Reflection eine Instanz von diesem Typ erstellen. Du kannst für mehr komfort gerne noch ein Interface nutzen, was diese Validate-Methode erzwingt (das Interface kann dann auch generisch sein, etc...)

Was du hingegen nicht prüfen kannst, ist, ob du beim typeof eine passende ValidatorKlasse angegeben hast, oder nur irgendeinen Typ; das müsstest du zur Laufzeit checken.

Eine Alternative wäre, spezialisierte Attribute zu nutzen, die bereits die konkrete Überprüfungslogik enthalten, statt ein generisches Attribut, dem man die Funktionalität erst noch als Parameter übergibt.

Weitere Lektüre wäre der Artikel [Artikel] Attribute zur Prüfung von Properties verwenden als auch ValidationRules und Attribute zur Validierung.

Beste Grüße
zommi

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo zoomi,

viele dank für deine schnelle und hilfreiche Antwort =) Funktioniert 👍