Подтвердить частичный класс с метаданными - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь проверить класс, который имеет частичный класс и класс метаданных. Когда я указываю атрибут непосредственно в классе, проверка работает, а когда с помощью метаданных, то нет. Как я могу подтвердить свой класс?

public class EntityMetadata
{
    [Required] // when through metadata it doesn’t work
    public string Property { get; set; }
}

[MetadataType(typeof(EntityMetadata))]
public partial class Entity
{

}

public partial class Entity
{
    [Required] // when directly it works
    public string Property { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Entity entity = new Entity();

        var context = new ValidationContext(entity, null, null);

        var results = new List<ValidationResult>();

        Validator.TryValidateObject(entity, context, results, true);

    }
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Вам необходимо зарегистрировать MetadataType с помощью AssociatedMetadataTypeTypeDescriptionProvider .

Если вы хотите избежать этого для всех типов по отдельности, вы можете вызвать это автоматически для всех типов в данном assembly.

using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace TestConsole
{
    public class EntityMetadata
    {
        [Required]
        public string Property { get; set; }
    }

    [MetadataType(typeof(EntityMetadata))]
    public partial class Entity
    {
    }

    public partial class Entity
    {
        public string Property { get; set; }
    }

    class Program
    {
        static void Main()
        {
            foreach (var type in typeof(Entity).Assembly.GetTypes())
            {
                TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(type), type);
            }

            Entity entity = new Entity();
            var context = new ValidationContext(entity, null, null);
            var results = new List<ValidationResult>();

            Validator.TryValidateObject(entity, context, results, true);
        }
    }
}
0 голосов
/ 25 октября 2019

если вы используете .NETFramework v4.7.x и System.ComponentModel.DataAnnotations, вы можете найти подтверждение в объекте результата после выполнения:

results[0]

Код:

        Entity entity = new Entity();

        var context = new ValidationContext(entity, null, null);

        var results = new List<ValidationResult>();

        TypeDescriptor.AddProviderTransparent(
        new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Entity), typeof(EntityMetadata)), typeof(Entity));

        Validator.TryValidateObject(entity, context, results, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...