.Net 4 атрибут RTM MetadataType игнорируется при использовании валидатора

StackOverflow https://stackoverflow.com/questions/2657358

Вопрос

Я использую 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, кажется, работает для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top