Gisterenavond even een stukje code gemaakt waar ik wel trots op ben

Ben nu een tijdje bezig in WPF iets leuks te maken en ben wat aan het spelen met binding en validatie.
Nu had ik binding met die INotifyPropertyChanged al goed aan de gang (hoewel het bagger is dat je zelf het PropertyChanged event moet triggeren met een string parameter

, maar goed daar is wel een snippet voor te maken), maar zat validatie me een beetje dwars. Had de interface IDataErrorInfo al gevonden, maar daar krijg je de property naam als string mee en moest je op basis daarvan je validatie maar uitpluizen...
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public string this[string columnName] {
get {
string res = null;
if (columnName == "Name") {
if (!ValidationHelper.ValidateMaxLength(Name, 255)) {
res = ValidationHelper.PrepareMessage(ValidationHelper.ValidationMessageMaxLength, "Name", 255);
}
} else if (columnName == "Role") {
if (!ValidationHelper.ValidateMaxLength(Name, 100)) {
res = ValidationHelper.PrepareMessage(ValidationHelper.ValidationMessageMaxLength, "Role", 100);
}
}
return res;
}
} |
Dat zat me toch niet helemaal lekker... Als je flinke classes hebt wordt een dergelijke functie vanzelf een drama.
Nu zag ik dat je DataAnnotations had in .NET, maar dat schijnt wel te werken bij MVC, maar WPF schijnt dat niet native te ondersteunen (tenminste dat was wat ik begreep en wat ik ondervonden had was dat het toepassen van die DataAnnotations binnen WPF niet automatisch iets opleverde). Het is natuurlijk mooier om je validatie op basis van attributen te doen (dus [Required()] of [StringLength(MaxLength)]) in plaats van alle validatie in een functie te kieperen. Je krijg dan namelijk een lading dubbele code (je moet voor iedere property die validatie starten).
Helaas schrijven veel tutorials het wel op de eerstgenoemde manier.
Uiteindelijk maar eens de mouwtjes opgestroopt en gekeken of ik via reflectie iets moois kon doen en na ongeveer een half uurtje knutselen is het me gelukt om een functie te bouwen waaraan de property naam wordt meegegeven (vanuit de public string this[string columnName]) en die vervolgens mbv reflection uitpluist welke validatie attributen er zijn en daar de validaties van uitvoert (waarbij de huidige DataAnnotation attributen uiteraard ook gebruikt worden, het wiel opnieuw uitvinden is niet echt handig). Dit alles zit nu in een base class waarvan mijn dataobjecten erven zodat ik in ieder geval voldoe aan DRY (Don't Repeat Yourself).
Het is vast geen revolutionair idee, maar was toch wel trots toen ik het voor elkaar had

Dit scheelt me een ontzettende bak dubbele code en voorkomt dat ik perongeluk iets vergeet te bouwen in de validatie functie. Nu is het gewoon een kwestie van attributen toepassen en gaan met die banaan

Daarnaast is het toch wel een kleine overwinning dat ik best makkelijk een functie met reflection heb opgezet