c# – 是否有一种类型安全的方法来引用属性中的类/属性?
假设我有一个类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的第二部分中引用的属性不是类型安全的.只是好奇是否有更好的方法来解决这个问题(属性或其他)? 谢谢. 解决方法
从C#语言的角度来看,没有什么可以使它在编译时绝对安全,没有.
有些事情你可以帮忙.在C#6中,你可以使用nameof运算符,这使得它对重构友好,并且如果你做了一些愚蠢的事情就会更明显: [ValidationAttribute(typeof(Address),nameof(Address.ZipCode))] 接下来,您可以验证单元测试中的每个属性用法.这很简单,如果你擅长经常运行你的测试,那么你会非常安全:) 如果您感觉更冒险,可以编写一个Roslyn Code Diagnostic,它将验证每次使用ValidationAttribute是否正确 – 甚至可能检查它是否也使用了nameof语法.这是比单元测试更多的代码编写,但它会给你“编辑时间”支持. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |