对不起,如果这个问题看起来太广泛,但是我有点不确定我应该怎么做这个任务。
我有一些对象:
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。
使用PropertyPath
属性扩展ValidationError
类,并在每个父验证器
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;
}
}
}