.NET 4 RTM MetadataType Attribut ignoriert, wenn Validator
-
27-09-2019 - |
Frage
Ich bin mit VS 2010 RTM und versuchen, einige grundlegende Überprüfung auf einfache Art auszuführen MetadataTypeAttribute verwenden. Wenn ich auf der Hauptklasse die Validierung Attribut setzen, funktioniert alles. Allerdings, wenn ich es auf der Metadatenklasse setzen, so scheint es, um ignoriert zu werden. Ich muss etwas trivial fehlt, aber ich habe für eine Weile auf diese aufgeklebt.
hatte ich einen Blick auf die Enterprise Library Validierungsblock als Behelfslösung, aber es bietet keine Unterstützung für die Validierung einzelner Objekte aus der Box. Irgendwelche Ideen?
class Program
{
static void Main(string[] args)
{
Stuff t = new Stuff();
try
{
Validator.ValidateProperty(t.X, new ValidationContext(t, null, null) { MemberName = "X" });
Console.WriteLine("Failed!");
}
catch (ValidationException)
{
Console.WriteLine("Succeeded!");
}
}
}
[MetadataType(typeof(StuffMetadata))]
public class Stuff
{
//[Required] //works here
public string X { get; set; }
}
public class StuffMetadata
{
[Required] //no effect here
public string X { get; set; }
}
Lösung
Es scheint, dass der Validator MetadataTypeAttribute nicht respektiert:
http://forums.silverlight.net/forums/p/149264 /377212.aspx
Die Beziehung muss explicity registriert werden:
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(Stuff),
typeof(StuffMetadata)),
typeof(Stuff));
Diese Hilfsklasse wird alle Metadaten Beziehungen in einer Baugruppe registrieren:
public static class MetadataTypesRegister
{
static bool installed = false;
static object installedLock = new object();
public static void InstallForThisAssembly()
{
if (installed)
{
return;
}
lock (installedLock)
{
if (installed)
{
return;
}
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
foreach (MetadataTypeAttribute attrib in type.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
{
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(type, attrib.MetadataClassType), type);
}
}
installed = true;
}
}
}
Andere Tipps
eine Instanz der Metadatenklasse Versorgung anstelle der Hauptklasse an den ValidationContext Konstruktor scheint für mich arbeiten.