C#类使用数据属性进行验证和更正

C#类使用数据属性进行验证和更正,c#,validation,C#,Validation,我试图根据类的属性(如required、max length、default值等)验证类。我不想仅仅确定对象是否有效,我还想尝试通过修剪、初始化(例如,如果必填字段为空,则null为“”)来更正这些值 我确实发现了一些关于类的手动验证的帖子 但我不知道如何更正的对象值,它们是无效的 同样,这是一个简单的POCO类,我唯一关心的是验证该类,如果我试图实现的是不可能的,我总是可以手动验证每个属性。欢迎提出建议 目前,我正尝试使用indexer和Validator.TryValidateObjec

我试图根据类的属性(如required、max length、default值等)验证类。我不想仅仅确定对象是否有效,我还想尝试通过修剪、初始化(例如,如果必填字段为空,则null为“”)来更正这些值

我确实发现了一些关于类的手动验证的帖子

但我不知道如何更正的对象值,它们是无效的

同样,这是一个简单的POCO类,我唯一关心的是验证该类,如果我试图实现的是不可能的,我总是可以手动验证每个属性。欢迎提出建议

目前,我正尝试使用indexer和Validator.TryValidateObject()完成此任务,如下所示:

class Customer
{

    public int Id { get; set; }

    [Required(ErrorMessage = "required"), MaxLength(250)]
    public string Name { get; set; }

    [DefaultValue('N')]
    public char Active { get; set; }

    public object this[string propertyName]
    {
        get { return this.GetType().GetProperty(propertyName).GetValue(this, null); }
        set { this.GetType().GetProperty(propertyName).SetValue(this, value, null); }
    }
}
class Program
{
    static void Main(string[] args)
    {
        var customer = new Customer { Id = 1, Active = 'Y', Name = null };

        var context = new ValidationContext(customer, serviceProvider: null, items: null);
        var results = new List<ValidationResult>();
        bool isValid = Validator.TryValidateObject(customer, context, results); // false
        foreach (var result in results)
        {
            object value = customer[result.MemberNames.First().ToString()];
            switch (result.ErrorMessage)
            {
                case "required" :
                    customer[result.MemberNames.First().ToString()] = "John Smith";
                    break;
                default:
                    break;
            }
        }
        results.Clear();
        isValid = Validator.TryValidateObject(customer, context, results); // true
    }
}
class客户
{
公共int Id{get;set;}
[必需(ErrorMessage=“必需”),最大长度(250)]
公共字符串名称{get;set;}
[默认值('N')]
公共字符活动{get;set;}
公共对象此[string propertyName]
{
get{返回this.GetType().GetProperty(propertyName).GetValue(this,null);}
set{this.GetType().GetProperty(propertyName).SetValue(this,value,null);}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var customer=new customer{Id=1,Active='Y',Name=null};
var context=新的ValidationContext(客户、服务提供商:null,项目:null);
var results=新列表();
bool isValid=Validator.TryValidateObject(客户、上下文、结果);//false
foreach(结果中的var结果)
{
对象值=客户[result.MemberNames.First().ToString()];
开关(结果错误消息)
{
案例“必需”:
客户[result.MemberNames.First().ToString()]=“John Smith”;
打破
违约:
打破
}
}
结果:清晰();
isValid=Validator.TryValidateObject(客户、上下文、结果);//true
}
}

您通常不会更正这些值(毕竟您如何知道它们应该是什么),您只需在UI中显示一条适当的消息,告诉用户这些值无效的原因。@BenRobinson同意。但在这里,我试图将数据传递给一个内部web服务,我已经收到了来自团队的验证规范。我的目标是向模型类(或我称之为“合同”)添加属性,并以某种方式提出验证/更正方案。@Blaze如果没有系统的详细信息,很难给出具体的建议,但如果其交互向用户显示适当的错误,如果它自动记录错误。如果您粘贴代码,我们将更容易帮助您相应地修改它,而不是要求社区从头开始提供一个完整的示例。如果必填字段留空,则验证层填充它将是一个坏主意,因为上层再也不知道出了什么问题。“修复”这些值不太可能最终得到一个我们想要的请求——这是我们的目标,而不是得到一个仅仅有效的请求。假设您帮助“修剪”了一个过长的用户名字段?Bam,潜在的安全问题。如果必须这样做,请确保将其与验证分开。