ValidationContext funktioniert nun auch mit dem Native AOT-Compiler.
Die .NET-Klasse System.ComponentModel.DataAnnotations.ValidationContext verwendet bisher sogenannte „Unbound Reflection“ (Reflection auf einem Typ, der zur Compile-Zeit nicht bekannt ist), um bei dem zu validierenden Objekt die Annotation [DisplayName] zu suchen.
Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.
Das funktioniert aber nicht mit dem NativeAOT-Compiler.
Bisher erschien eine Warnung beim Einsatz von ValidationContext bei Native AOT-Kompilierung (Abb. 1).
Eine neue Überladung löst das Problem: Man kann nun den Displayname als Parameter beim Konstruktor angeben:
var context = new ValidationContext(person, "PersonObjekt", null, null);
Folgendes Codebeispiel zeigt den Einsatz von ValidationContext:
using System.ComponentModel.DataAnnotations;
using ITVisions;
namespace NET10_Console;
internal class FCL10_ValidationContext
{
[Display(Name = "Personobjekt")]
public class Person
{
[Range(1, Int32.MaxValue)]
[Display(Name = "Person-ID")]
public int ID { get; set; }
[Required]
[Display(Name = "Person-Name")]
public string Name { get; set; }
[Range(0, 120)]
[Display(Name = "Person-Age")]
public int Age { get; set; }
}
public void Run()
{
CUI.Demo(nameof(FCL10_ValidationContext));
var person = new Person { ID = 0, Name = "", Age = 150 }; // absichtlich ungültig
//var context = new ValidationContext(person); // Dieser Konstruktor wird via Reflection [Display] suchen
var context = new ValidationContext(person, "Person-Objekt", null, null); // Dieser neue Konstruktor funktioniert auch mit AOT
var results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(person, context, results, validateAllProperties: true);
if (!isValid)
{
CUI.LineRed("Validierungsfehler bei " + context.DisplayName + "");
foreach (var validationResult in results)
{
CUI.LI(validationResult.ErrorMessage);
}
}
else
{
CUI.Success($"{context.DisplayName} ist gültig.");
}
}
}
Ausgabe des Codebeispiels (Abb. 2)
(rme)
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Бенчмаркая Regex: конструктор показал 10 мкс, первый вызов — 1307 | 0 | 19.31 | 26-07-2026 |
| 2 | Бенчмаркая Regex: конструктор показал 10 мкс, первый вызов — 1307 | 0 | 19.31 | 26-07-2026 |
| 3 | Бенчмаркая Regex: конструктор показал 10 мкс, первый вызов — 1307 | 0 | 19.31 | 26-07-2026 |
| 4 | GitLab 19.2, Kotlin feiert Geburtstag, Unity CLI | 0 | 14.49 | 25-07-2026 |
| 5 | Sicherheitsupdate n8n: Accountübernahme und Sandboxausbruch möglich | 0 | 13.13 | 24-07-2026 |
| 6 | Adobe camera app’s new feature will critique your photos using AI | 0 | 8.62 | 20-07-2026 |
| 7 | iOS 26.6, macOS 26.6 und mehr: Apple stellt neue Betriebssysteme bereit | 0 | 13.2 | 27-07-2026 |
| 8 | Anonymisierendes Linux Tails 7.10: Neuer Shutdown und Videoplayer | 0 | 17.36 | 23-07-2026 |
| 9 | В России ввели новые обязательные и дополнительные реквизиты кассового чека | 0 | 0 | 31-08-2025 |
| 10 | ROSEN extends RoCorr MFL-A service portfolio with MFL-A Plus performance specifications | 0 | 17.47 | 21-07-2026 |