gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:09:26 24 4
gpt4 key购买 nike

假设我有一个类 PersonAddressValidator,它接受一个人对象和一个地址对象并进行一些验证(这并不是我正在建模的真正问题,所以如果这看起来过于简单,请多多包涵)。

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 代码诊断程序来验证 ValidationAttribute 的每次使用是否正确 - 甚至可能检查它是否使用了 nameof 语法也是。与单元测试相比,这需要编写更多的代码,但它会为您提供“编辑时间”支持。

关于c# - 是否有类型安全的方法来引用属性中的类/属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com