是否有一种类型安全的方法来引用属性中的类/属性?

时间:2015-03-20 13:20:45

标签: 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的第二部分中引用的属性不是类型安全的。只是好奇是否有更好的方法来解决这个问题(属性或其他)?

感谢。

1 个答案:

答案 0 :(得分:7)

从C#语言的角度来看,没有什么可以让它在编译时绝对安全,没有。

但是,您可以对帮助做些事情。在C#6中,你可以使用nameof运算符,这使得重构友好,如果你做了一些愚蠢的事情,那就更明显了:

[ValidationAttribute(typeof(Address), nameof(Address.ZipCode))]

接下来,您可以验证单元测试中的每个属性用法。这很简单,如果你擅长定期运行测试,那么你会非常安全。)

如果您感觉更冒险,可以编写一个Roslyn Code Diagnostic,它将验证ValidationAttribute的每次使用是否正确 - 甚至可能检查它是否也使用nameof语法。这是比单元测试更多的代码编写,但它会给你“编辑时间”支持。