.Net 4 атрибут RTM MetadataType игнорируется при использовании валидатора
-
27-09-2019 - |
Вопрос
Я использую VS 2010 RTM и пытаюсь выполнить некоторую базовую проверку на простом типе с использованием метадатаTATATYPEATTRIBUTE. Когда я положил атрибут проверки на главном классе, все работает. Однако, когда я положил его на класс метаданных, это, кажется, игнорируется. Я должен пропустить что-то тривиальное, но я застрял на это некоторое время.
Я посмотрел на блок проверки библиотеки предприятия в качестве обходного пути, но он не поддерживает проверку одного свойства из коробки. Любые идеи?
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; }
}
Решение
Похоже, что валидатор не уважает метадататаТатироватьтрибут:
http://forums.silverlight.net/forums/p/149264/377212.aspx.
Отношения должны быть зарегистрированы с четкостью:
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(Stuff),
typeof(StuffMetadata)),
typeof(Stuff));
Этот класс помощника зарегистрирует все отношения метаданных в сборке:
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;
}
}
}
Другие советы
Поставляя экземпляр класса метаданных вместо основного класса в конструктор ValidationContext, кажется, работает для меня.