如何使用自定义属性覆盖属性设置器?

时间:2018-11-27 16:43:33

标签: c#

例如。

[NoZero()]
public int Quantity{ get; set; }

基本上,我不希望将“数量”设置为小于零。

2 个答案:

答案 0 :(得分:1)

这不会直接回答您的问题,而是提供一个有趣的替代方法。

如果您使用的是IoC框架,并且该框架具有“拦截”的可能性,则可以强制拦截您的属性访问权限(只要该类通过IoC正常传递)。

Ninject Intercept any method with certain attribute?

我还没有尝试过使用财产访问权,但是从理论上讲它可以工作。

或者,或者直接使用代码编织库:https://github.com/Fody/Fody可以有效地将自身编织到IL中。

答案 1 :(得分:0)

传统方式是

protected int _quantity;

public int Quantity
{
    set
    {
        if (_quantity < 0) throw new ArgumentOutOfRangeException("Some message");
        _quantity = value;
    }
    get
    {
        return _quantity;
    }
}

除非在设置属性之前编写用于检查属性的代码,否则您无法真正使用属性。例如,DataAnnotation attributes就是这样工作的。在文档中,注意以下几点:

  

要实现上述要求,我们需要在UI层中进行编码,以适应/验证上述条件。

因此,您必须编写许多复杂的代码,并且要注意不要直接设置该属性。这就是为什么大多数人不使用属性的原因。