Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用元数据验证分部类_C#_Validation - Fatal编程技术网

C# 使用元数据验证分部类

C# 使用元数据验证分部类,c#,validation,C#,Validation,我试图验证一个具有分部类和元数据类的类。 当我直接在类中指定一个属性时,验证工作,当通过元数据时,则否。 如何验证我的类 public class EntityMetadata { [Required] // when through metadata it doesn’t work public string Property { get; set; } } [MetadataType(typeof(EntityMetadata))] public partial class

我试图验证一个具有分部类和元数据类的类。 当我直接在类中指定一个属性时,验证工作,当通过元数据时,则否。 如何验证我的类

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);

    }
}
公共类EntityMetadata
{
[必需]//通过元数据时,它不起作用
公共字符串属性{get;set;}
}
[元数据类型(typeof(EntityMetadata))]
公共部分类实体
{
}
公共部分类实体
{
[必需]//当它直接工作时
公共字符串属性{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
实体=新实体();
var context=新的ValidationContext(实体,null,null);
var results=新列表();
TryValidateObject(实体、上下文、结果、true);
}
}

如果使用.NETFramework v4.7.x和System.ComponentModel.DataAnnotations,执行以下操作后,可以在结果对象中找到验证:

results[0]
代码:

实体实体=新实体();
var context=新的ValidationContext(实体,null,null);
var results=新列表();
TypeDescriptor.AddProviderTransparent(
新的关联MetadataTypeDescriptionProvider(typeof(实体)、typeof(EntityMetadata))、typeof(实体));
TryValidateObject(实体、上下文、结果、true);

您需要向注册
元数据类型

如果要避免对所有类型单独执行此操作,可以对给定
程序集中的所有类型自动调用此操作

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);
        }
    }
}
使用System.Collections.Generic;
使用系统组件模型;
使用System.ComponentModel.DataAnnotations;
命名空间测试控制台
{
公共类EntityMetadata
{
[必需]
公共字符串属性{get;set;}
}
[元数据类型(typeof(EntityMetadata))]
公共部分类实体
{
}
公共部分类实体
{
公共字符串属性{get;set;}
}
班级计划
{
静态void Main()
{
foreach(typeof(Entity.Assembly.GetTypes()中的变量类型)
{
TypeDescriptor.AddProvider(新关联的MetadataTypeDescriptionProvider(类型),类型);
}
实体=新实体();
var context=新的ValidationContext(实体,null,null);
var results=新列表();
TryValidateObject(实体、上下文、结果、true);
}
}
}

检查是否解决了您的问题。此问题是否缺少标记?什么技术使用了
[Required]
标记?AssociatedMetadataTypeDyscriptionProvider注册帮助。但对于其他实体,我必须经常手动执行此操作。是否有任何方法可以获取附加到此类的所有元数据类?验证的结果将进入结果列表,但如果在元数据类中指定了必需的属性,则不会使用该属性字段进行验证。AssociatedMetadataTypeDyscriptionProvider注册帮助。但对于其他实体,我必须经常手动执行此操作。是否有任何方法可以获取附加到此类的所有元数据类?您可以创建一个从Validator继承的类,并重写AddProviderTransparent方法,然后在其中添加AssociatedMetadataTypeDescriptionProvider
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);
        }
    }
}