假设我有一个类PersonAddressValidator,它接受一个person对象和一个地址对象并进行一些验证(这不是我正在建模的问题,所以如果这看起来过于简单,请耐心等待。)
class PersonAddressValidator : IPersonAddressValidator
{
bool Validate(Person p, Address a)
{
// sample "validation"
if (p.FirstName.StartsWith("a") && a.ZipCode == 91402)
{
return false;
}
}
}
我们还假设有许多不同的对象为不同的业务规则实现IPersonAddressValidator。
在上面的例子中,我引用了人的“FirstName”和地址的“ZipCode”。我想以某种方式注意到这个类正在使用它们各自对象的这些属性。我之所以这样做,是因为如果有人想对所有人/地址组合运行此验证,他们可以很容易地看到导致验证类通过或失败的相关属性。
我在想这是我可以用属性做的事情:
[ValidationAttribute(typeof(Person), "FirstName")]
[ValidationAttribute(typeof(Address), "ZipCode")]
class PersonAddressValidator : IPersonAddressValidator
{
bool Validate(Person p, Address a)
{
// sample "validation"
if (p.FirstName.StartsWith("a") && a.ZipCode == 91402)
{
return false;
}
}
}
这种方法的一个明显问题是我在ValidationAttribute的第二部分中引用的属性不是类型安全的。只是好奇是否有更好的方法来解决这个问题(属性或其他)?
感谢。
答案 0 :(得分:7)
从C#语言的角度来看,没有什么可以让它在编译时绝对安全,没有。
但是,您可以对帮助做些事情。在C#6中,你可以使用nameof
运算符,这使得重构友好,如果你做了一些愚蠢的事情,那就更明显了:
[ValidationAttribute(typeof(Address), nameof(Address.ZipCode))]
接下来,您可以验证单元测试中的每个属性用法。这很简单,如果你擅长定期运行测试,那么你会非常安全。)
如果您感觉更冒险,可以编写一个Roslyn Code Diagnostic,它将验证ValidationAttribute
的每次使用是否正确 - 甚至可能检查它是否也使用nameof
语法。这是比单元测试更多的代码编写,但它会给你“编辑时间”支持。