加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:23:24 所属栏目:百科 来源:网络整理
导读:假设我有一个类PersonAddressValidator,它接受一个person对象和一个地址对象并进行一些验证(这不是我正在建模的问题,所以如果这看起来过于简单化,请耐心等待). class PersonAddressValidator : IPersonAddressValidator{ bool Validate(Person p,Address a)
假设我有一个类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语法.这是比单元测试更多的代码编写,但它会给你“编辑时间”支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读