在验证数据注释时,为什么在您要验证的属性上使用get访问器时,它似乎只是验证(正确)?
鉴于下面的示例,Name
属性将始终被视为有效,即使它未被分配,但Address
属性只有在分配了非空字符串值时才被视为有效,因为它使用get
访问器。这是为什么?
肯定TryValidateObject
基本上只会使用test.Address
来访问该值,无论是否通过get访问器。
class Program
{
static void Main(string[] args)
{
var test = new Test();
var _errors = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(
test, new ValidationContext(test), _errors, true);
}
}
public class Test
{
[Required]
public string Name; // Returns true even when unassigned / null / empty string
[Required]
public string Address { get; } // Only returns true when assigned a non-empty string
}
答案 0 :(得分:2)
原因是Validator.TryValidateObject
只会检查属性和类级别注释,但您的Name
是一个字段,而不是一个属性(请参阅here Validator
类的文档没有提到字段)。如果您将任何其他属性(例如Range
)应用于某个字段 - 它也无法使用Validator.TryValidateObject
。 RequiredAttribute
可以应用于字段的原因是因为RequiredAttribute
是其自身的实体,并且与任何方式的Validator类无关。任何其他验证机制都可以验证公共字段,它只是特定的Validator
类,而不是。