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