如何在对象中引用无效属性?

时间:2017-09-04 10:06:30

标签: c#

对不起,如果这个问题看起来太宽泛,但我有点不确定应该怎么做这个任务。

我有一些对象:

public class A
{
    public B b {get;set;}
    public C[] cList {get;set;}
}

public class B
{
    public string val1 {get;set;}
}

public class C
{
    public string val2 {get;set;}
}

还有一组验证器:

public class AValidator : IValidator<A>
{
    IEnumerable<ValidationError> Validate(A obj){...}
}

public class BValidator : IValidator<B>
{
    IEnumerable<ValidationError> Validate(B obj){...}
}

public class CValidator : IValidator<C>
{
    IEnumerable<ValidationError> Validate(C obj){...}
}

错误如下所示:

public class ValidationError
{
    public int Code {get;set;}
    public string Message {get;set;}
}

我执行这样的验证:

_validator.Validate(new A()).ThrowIfInvalid();

但是问题是,如何引用无效属性和序列化/反序列化此引用以在客户端上使用它?

例如,如果new A().c[2].val2无效,我应该能够在服务器上获取此路径并在客户端上将其用于我的视图(获取PropertyInfo和object)。

C#中是否有一些扩展/库提供属性的可序列化引用?例如,像XML中的XPath。

1 个答案:

答案 0 :(得分:0)

使用ValidationError属性扩展类PropertyPath并将其添加到每个父验证程序

public class AValidator : IValidator<A>
{
    IEnumerable<ValidationError> Validate(A obj)
    {
        if(obj.b == null)
            yield return new ValidationError {Message = "b is null", PropertyPath = "a.b"};
        else
        { 
            var bresults = new BValidator().Validate(obj.b);
            foreach(var result in bresults)
            {
                result.PropertyPath = "a.b." + result.PropertyPath;
                yield return result;
            }
        }
...
            var cresults = new BValidator().Validate(obj.c[i]);
            foreach(var result in cresults)
            {
                result.PropertyPath = "a.c[i]." + result.PropertyPath;
                yield return result;
            }
    }        
}